【问题标题】:convert signed integer array in big endian to hexa decimal 16 bit in little endian in c将大端的有符号整数数组转换为c中小端的十六进制16位
【发布时间】:2016-11-15 16:48:33
【问题描述】:

我是字节序的新手。 我正在尝试将大端整数数组转换为小端的十六进制字符串。我试图将大端整数数组转换为小端十六进制十进制字符串。但最后,得到大端六进制编码字符串而不是小端。请帮帮我

gint16 frame[5] = {10, -26, 35, 7, -35};  //big endian 
gint16 frame_i[5];
size_t i;
for (i= 0; i < 5; i++) {
  frame_i[i] = (frame[i] << 8) | ((frame[i] >> 8) & 0xFF);  //big endian to little endian
}
char *str = malloc(5 * 4 + 1);
size_t j;
for (j= 0; j < 5; j++) {
    snprintf(str + j * 4, 5, "%04X", frame_i[j] & 0xFFFF); // getting big endian  instead of little endian
}

【问题讨论】:

  • 我无法想象你为什么需要一个 little-endian 字符串。数字的文本表示始终为 m.s。数字第一。字节序与数组的组织方式无关:问题在于内存中的字节序列,多字节值由处理器自然存储。请read about endianness.
  • 此外,(frame_i[i] &lt;&lt; 8) | ((frame_i[i] &gt;&gt; 8) &amp; 0xFF); 这一行没有任何作用——表达式的值没有被赋值。
  • 请张贴Minimal, Complete, and Verifiable example,这样可以避免问题中出现愚蠢的错误,以免出现更多转录错误。
  • 对不起。将在以后的帖子中检查
  • @WeatherVane “数字的文本表示总是 m.s. digit first。” --> 像“十四”(四 + 十)这样的文本表示怎么样? ;-)

标签: c endianness


【解决方案1】:

表达式(frame_i[i] &lt;&lt; 8) | ((frame_i[i] &gt;&gt; 8) &amp; 0xFF); 无效(如果您使用了-Wall 编译器选项,您会注意到这一点)。此外,您应该对frame 变量应用此操作,并将结果存储在frame_i 中,例如:

int16_t frame[5] = {10, -26, 35, 7, -35};
int16_t frame_i[5] = {0};
size_t i;

for (i = 0; i < sizeof(frame) / sizeof(int16_t); i++) {
  frame_i[i] = (frame[i] << 8) | ((frame[i] >> 8) & 0xFF);
}

for (i = 0; i < sizeof(frame) / sizeof(int16_t); i++) {
  printf("%04X -> %04X\n", frame[i] & 0xFFFF, frame_i[i] & 0xFFFF);
}

输出

000A -> 0A00
FFE6 -> E6FF
0023 -> 2300
0007 -> 0700
FFDD -> DDFF

注意,正如 @WeatherVane 所指出的,负符号整数的右移具有实现定义的行为。请参阅this 问题的答案。考虑使用无符号类型,例如uint16_t 来自stdint.h

【讨论】:

  • 请使用unsigned 类型进行此类转换?
  • @WeatherVane,你的意思是右移是为签名实现定义的吗?
  • 是的,我确实是这个意思。
  • 次要观点:sizeof(frame) / sizeof(int16_t) 可以,但请考虑sizeof (frame) / sizeof(frame[0])sizeof (frame) / sizeof(*frame)sizeof frame / sizeof *frame。只编码变量,而不是它的类型,这样更容易维护。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多