【问题标题】:Data type conversion uint8_t/uint16_t to char[] via snprintf通过 snprintf 将 uint8_t/uint16_t 数据类型转换为 char[]
【发布时间】:2015-10-09 21:26:21
【问题描述】:
char data[40] = {'\0'};
uint8_t Plevel= 0xA5;
uint8_t status = 0x21;
uint16_t ID = 0xABCD;

snprintf(data, 5, "%"PRIu8"%"PRIu8"%"PRIu16"",Plevel, status, ID );
printf("data:%s\n",data);

输出:1653

我使用http://www.asciitohex.com/ 来查看转换,但不明白为什么它会输出 1653。

谁能解释一下这些转换?

【问题讨论】:

    标签: c char printf type-conversion uint8t


    【解决方案1】:

    0xA5 输出 165。0x21 输出 33。0xABCD 输出 43981。这给出了 1653343981。但是您的输出字符串大小限制为5(包括nul 终止符),因此您得到1653

    【讨论】:

    • 谢谢你:) 这不是我的问题,但如果你也能回答我会很高兴。我的目标是将 uin8_t 存储为 1 个字节(我正在尝试进行数据序列化)。我需要一个十六进制到 ASCII 转换器还是可以通过 snprintf 以不同方式存储它而不是使用“PRIu8”?
    • 类型uint8_t存储为一个字节。将值指定为十六进制 0xA5 或十进制 165 没有区别。它们都代表相同的值。一个字节既不存储 0xA5 也不存储 165 字面意思:它包含一个表示值的位模式。
    • 我的意思是,要将 0xA5 传递给“数据”,它需要 snprintf 上的 3 个字节空间(字符串长度)。但我想将其保留为 1 个字符而不是 3 个。我可以在 snprintf 上使用除 %"PRIu8" 之外的任何其他字符吗?还是我需要一个十六进制到 ASCII 转换器?
    • 您可以将一个或多个字节放入一个 char 数组 (data[0]=Plevel;),但您将无法使用任何字符串函数,因为数据不是文本的。
    • 我使用 snprintf 将数据传递到 UDP 套接字,如果数据不是文本就可以了。你知道我是否可以通过 snprintf 将 0xA5 作为 1 个元素传递给 char 数组,还是需要一个 ASCII 转换器?
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2019-10-14
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多