在CI中,需要在嵌入式系统中以十六进制形式打印可变数量的字符以进行调试。由于这是调试跟踪宏的一部分,因此我想避免循环或其他printf
无法处理的逻辑。我也不想声明任何新变量来防止Heisenbug问题。输出空间也是一个问题,因此我想将其以十六进制形式转储。
uint8_t* buffer;
uint8_t length;
MakeString(*message, &buffer, &length); //Function that puts some values in buffer and sets length
我正在寻找一个可以占用缓冲区和长度来生成类似内容的printf:
0x1A1B1C0A02
对于值为{1A,1B,1C,0A,02}且长度= 5
我知道%.*s
还是%*
可以处理大小变量。没有for / while循环,有没有办法做到这一点?
过去,我使用过以下内容:
void
to_hex(char *output, size_t out_len, uint8_t const *input, size_t in_len)
{
static const char digits[] = "0123456789abcdef";
if (out_len < 1) {
return;
}
--out_len; /* reserve space for that NUL terminator */
while (out_len > 1 && in_len) {
*output++ = digits[(*input & 0xF0) >> 4];
*output++ = digits[*input & 0x0F];
out_len -= 2;
++input, --in_len;
}
if (in_len) {
*output++ = digits[(*input & 0xF0) >> 4];
}
*output = '\0';
}
它唯一使用的内存是静态和常量,因此通常在BSS中进行分配。如果您有内存映射的输出设备,则可以简化此操作并省略输出缓冲区,然后直接写入内存位置。您可以对其进行更多优化,并将其隐藏在宏后面,以便在发行版本中将其忽略。
我工作的系统没有printf
或sprintf
实现,因此我们通常滚动自己的十六进制转储代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句