我需要在嵌入式系统中以十六进制形式打印可变数量的字符,以进行调试

山逻辑

在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中进行分配。如果您有内存映射的输出设备,则可以简化此操作并省略输出缓冲区,然后直接写入内存位置。您可以对其进行更多优化,并将其隐藏在宏后面,以便在发行版本中将其忽略。

我工作的系统没有printfsprintf实现,因此我们通常滚动自己的十六进制转储代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有嵌入式十六进制编码的Java字符串

在grep中搜索字符的十六进制表示形式时,为什么需要显式的LANG = C?

打印十六进制字符

将可变数量的参数传递给嵌入式python API

如何在perl中以原始字节十六进制形式打印字符串?

在 bash 中打印字符的十六进制值

需要将列表中的十六进制值视为 int 以使用 bin() 进行计算。我错过了什么?

C-以十六进制形式打印负整数值会产生太多字符

当用户选择表单中的字符串时,我需要十六进制代码作为颜色

通过十进制数字快速循环进行打印(嵌入式)

如何在C ++中以大写形式打印地址(十六进制值)

字符数组中的十六进制

Grep 文件中的十六进制字符

BEGIN块中的十六进制字符

在Hack中打印可变数量字符的最有效方法?

WordPress:需要在Google嵌入式地图iframe中设置缩放级别

十六进制字符串表示形式为十六进制

获取十六进制数字的字符表示形式(创建char *以显示十六进制值)

mallinfo在嵌入式系统中的使用

嵌入式系统中的内存分配

使用十六进制格式说明符进行打印

什么是十六进制系统?

从 URL PHP 中删除非字母数字可打印字符的 ASCII 十六进制代码

如何将不可打印的字符转换为 C 中的十六进制值?

如何使用Rust在Substrate中编码帐户ID的十六进制字符串表示形式?

将十六进制字符串表示形式转换为在python中浮动

十六进制字符串表示形式到python中的浮点数

将以十六进制格式保存的字符串转换为python中以前的形式

fprintf:打印文字十六进制字符串