我对字节序不熟悉。
我正在尝试将大端整数数组转换为小端十六进制字符串。我试图将大端整数数组转换为小端六进制字符串。但最后,获取大端六进制编码字符串,而不是小端。请帮我
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
}
最佳答案
表达式(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);
}
输出量
000A -> 0A00
FFE6 -> E6FF
0023 -> 2300
0007 -> 0700
FFDD -> DDFF
注意,正如@WeatherVane指出的那样,负号整数的右移具有实现定义的行为。查看this问题的答案。考虑使用无符号类型,例如来自
uint16_t
的stdint.h
。关于c - 将大字节序的有符号整数数组转换为c中小字节序的十六进制16位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40615341/