将big endian中的有符号整数数组转换为c中的little endian中的hexa十进制16位

时间:2016-11-15 16:48:33

标签: c endianness

我是新手。 我试图将一个大端整数数组转换为小端的十六进制字符串。我试图将big endian整数数组转换为little endian hexa十进制字符串。但最后,得到大端六进制十六进制编码的字符串而不是小端。请帮帮我

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
}

1 个答案:

答案 0 :(得分:1)

表达式<script type="text/javascript"> // Change the value of this string to your URL var clickTag = "https://www.google.com/"; </script> 没有任何效果(如果您使用了(frame_i[i] << 8) | ((frame_i[i] >> 8) & 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);
}

注意,正如 @WeatherVane 所指出的那样,负有符号整数的右移具有实现定义的行为。查看this问题的答案。考虑使用无符号类型,例如来自000A -> 0A00 FFE6 -> E6FF 0023 -> 2300 0007 -> 0700 FFDD -> DDFF 的{​​{1}}。