将大端字节序的有符号整数数组转换为C中小端字节序的十六进制16位

标签 c endianness

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

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中小端字节序的十六进制16位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40615341/

相关文章:

c - C Endian是中立的吗?

c - 如何将函数值返回到主函数以在另一个函数中使用?

c - C中的Scanf数组限制?

c - Careercup 提出的一个关于字节序的问题

.net - 在 .NET 中反转字节顺序

c++ - c/c++中endian的最佳和可移植转换

c - 如何使用 cvGetCaptureProperty 检索视频格式

c - 使用从 recv() tcpServer c 接收的缓冲区的段错误

c - scanf 到结构中的字段的问题

c - 如何在C中以十六进制格式打印2或4个字节