在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从大端转换为小端的主要内容,如果未能解决你的问题,请参考以下文章

将任何变量从大端转换为小端 - 如何避免空指针?

从二进制文件读取时将大端转换为小端

大端小端存储模式

大端编码和小端编码

关于摩托罗拉的can协议(处理器为大端,协议为小端)

判断计算机是大端还是小端