【发布时间】:2016-07-14 09:15:02
【问题描述】:
假设我有一个包含 16 个 uint8_t 的数组,如下所示:
uint8_t array[] = {0x13, 0x01, 0x4E, 0x52, 0x31, 0x4A, 0x35, 0x36, 0x4C, 0x11, 0x21, 0xC6, 0x3C, 0x73, 0xC2, 0x41};
此数组存储包含在外部外围设备的 128 位寄存器中的数据。它所代表的一些信息存储在 2、3、8、12 位......等等。
什么是最好和最优雅的方式来分割它并掩码我需要的信息? (问题是我需要的一些东西与数组的一个单元格的长度重叠)
如果有帮助,我编写的这个 sn-p 将整个数组转换为 char* 字符串。但是将其转换为 int 不是选项,因为......好吧 16 个字节。
int i;
char str[33];
for(i = 0; i < sizeof(array) / sizeof(*array) ; i++) {
sprintf(str+2*i,"%02hX",array[i]);
}
puts(str);
13014E52314A35364C1121C63C73C241
【问题讨论】:
-
您的
str太短,如果sizeof(array) >= 8,您的程序将调用未定义的行为 以取消引用超出范围。它应该至少有 33 个 (2 * 16 + 1) 字符长。另外不要忘记在将数据传递给puts()之前通过添加'\0'来终止字符串。还有一点就是sizeof(array) / sizeof(*array)获取数组元素个数应该更安全。 -
你说得对,奇怪的是它在编译或运行时都没有产生任何错误......即使没有为其分配内存,它也只会打印出整个内容。无论如何,这只是思想的食物,我正在编辑它以使其正确,谢谢
-
啊,我注意到
sprintf()会终止字符串,所以你不必自己做。 -
正是我刚刚输入的内容。我刚刚在调试中尝试过,它确实终止了字符串
-
不可移植,但您可以在打包数据结构中使用位域