转换endianness的C代码?
我想按如下方式转换无符号32位整数:转换endianness的C代码?,c,endianness,C,Endianness,我想按如下方式转换无符号32位整数: Input = 0xdeadbeef Output = 0xfeebdaed 谢谢。这不是一个持久性转换。输出应该是0xEFBEADDE,而不是0xFEEBDAED。(仅交换字节,每个字节为2个十六进制数字。) 要在小端和大端之间转换,请看。这不是端转换。输出应该是0xEFBEADDE,而不是0xFEEBDAED。(仅交换字节,每个字节为2个十六进制数字。) 要在小端和大端之间转换,请看。小端反转的一般过程是: ((i&0xF0000000)>>28)
Input = 0xdeadbeef
Output = 0xfeebdaed
谢谢。这不是一个持久性转换。输出应该是
0xEFBEADDE
,而不是0xFEEBDAED
。(仅交换字节,每个字节为2个十六进制数字。)
要在小端和大端之间转换,请看。这不是端转换。输出应该是
0xEFBEADDE
,而不是0xFEEBDAED
。(仅交换字节,每个字节为2个十六进制数字。)
要在小端和大端之间转换,请看。小端反转的一般过程是: ((i&0xF0000000)>>28)|((i)& 0xF000000)>>20)|((i&0xF00000)>>12)
| ..... | ((i&0xF)>和半字节反转的一般过程是: ((i&0xF0000000)>>28)|((i)& 0xF000000)>>20)|((i&0xF00000)>>12)
|...((i&0xF)>您给出的示例将数字翻转4位块,而不是完整的8位字节。这真的是您想要做的吗?您反转了半字节,而不是字节…endianess?您给出的示例将数字翻转4位块,而不是完整的8位字节。这真的是您想要做的吗?您反转了半字节,而不是字节…eNdianes?或者可能是*nix系统上的
htonl
(附带注意,htonl
将是big-endian系统上的无操作)。我发现htobe16
,htole16
,le16toh
,以及32位版本更有用(而且更明确)编写跨平台代码时。如果给定的平台没有它们,则很容易将名称映射到该平台所具有的任何名称。@tomlogic:这些名称在big-endian系统上不起作用……而且你不能同样轻松地重新映射\u byteswap\u ulong
?它只是一个\define
..htobe16
和htole16
工作j无论是在大端还是小端系统上都可以。在大端系统上,htobe16
是一个不做任何事情的宏,并且htole16
映射到byteswap。在小端系统上,情况正好相反。您很少想交换字节顺序——您更可能想在主机字节顺序和大端或小端之间转换。@tomlogic:That意味着它不做OP想要做的事情,因为它在big-endian系统上不工作。\或者可能是*nix系统上的htonl
on*nix系统(附带注意,htonl
将是big-endian系统上的无OP)。我发现htobe16
,htole16
,le16toh
,be16toh
和32位版本更有用(更明确)编写跨平台代码时。如果给定的平台没有它们,则很容易将名称映射到该平台所具有的任何名称。@tomlogic:这些名称在big-endian系统上不起作用……而且你不能同样轻松地重新映射\u byteswap\u ulong
?它只是一个\define
..htobe16
和htole16
工作j无论是在大端还是小端系统上都可以。在大端系统上,htobe16
是一个不做任何事情的宏,并且htole16
映射到byteswap。在小端系统上,情况正好相反。您很少想交换字节顺序——您更可能想在主机字节顺序和大端或小端之间转换。@tomlogic:That意味着它不能满足OP的要求,因为它不能在big-endian系统上工作\