【问题标题】:Convert char from big endian to little endian in C在C中将char从大端转换为小端
【发布时间】: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);

对于转换字符,如果可能的话,我想以同样的方式进行,因为这是我理解的唯一方法。

【问题讨论】:

    标签: c char endianness


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2015-04-14
    • 2018-10-19
    • 2013-10-17
    • 2019-12-03
    • 2017-12-31
    • 2011-02-16
    相关资源
    最近更新 更多