在C中将char从大端转换为小端
Posted
技术标签:
【中文标题】在C中将char从大端转换为小端【英文标题】:Convert char from big endian to little endian in C 【发布时间】:2014-03-12 18:52:43 【问题描述】:我正在尝试将 char 变量从大端转换为小端。
就是这样:
char name[12];
我知道如何在大端和小端之间转换 int,但是 char 让我很困惑。
我知道我必须先将它转换为整数形式,我有。
对于转换 int,这是我使用的:
(item.age >> 24) | ((item.age >> 8) & 0x0000ff00) | ((item.age << 8) & 0x00ff0000) | (item.age << 24);
对于转换字符,如果可能的话,我想以同样的方式进行,因为这是我理解的唯一方法。
【问题讨论】:
【参考方案1】:字节序仅影响字节顺序。由于char
正好是一个字节,因此在所有字节序格式上都是相同的。
请注意:您可能需要在 libc 中查找字节序转换函数:
htonl, htons
ntohl, ntohs
【讨论】:
所以我不需要对它做任何事情? @PM No :) 别担心char
。
@PM:宽字符的情况会有所不同,但wchar_t
。
@SergeyL。谢谢!这让事情变得更加简单!
我从未见过大端系统。我认为所有具有英特尔处理器的机器都是小端的。【参考方案2】:
字节顺序(又名字节序)对于单字节类型没有任何意义。
虽然char name[12]
由12个字节组成,但其类型的大小是一个字节。
所以你不需要对它做任何事情......
顺便说一句,int
的大小在所有编译器上不一定都是 4 字节,因此您可能需要使用更通用的转换方法(对于 any 类型):
char* p = (char*)&item;
for (int i=0; i<sizeof(item)/2; i++)
char temp = p[i];
p[i] = p[sizeof(item)-1-i];
p[sizeof(item)-1-i] = temp;
【讨论】:
我知道,但我已经知道我要处理的 int 大小,不过谢谢。 作为老工程师曾经称赞“我必须收回我说过的关于你的坏话的一半。” ;) @P M 这些帖子和答案不仅适用于您,还可以作为其他人的参考。即使认为int
的大小在这篇文章的实例中可能不是问题,int
的变体也可能适用于其他人。
@ajay char
是每个 C 标准的 1 个字节。但是一个 C 字节不能保证是 8 位。 char
和字节必须是 至少 8 位。见CHAR_BIT
。当然,大多数系统都使用 8 位字节。
POSIX 要求 CHAR_BIT == 8。以上是关于在C中将char从大端转换为小端的主要内容,如果未能解决你的问题,请参考以下文章