转换endianness的C代码?

转换endianness的C代码?,c,endianness,C,Endianness,我想按如下方式转换无符号32位整数: Input = 0xdeadbeef Output = 0xfeebdaed 谢谢。这不是一个持久性转换。输出应该是0xEFBEADDE,而不是0xFEEBDAED。(仅交换字节,每个字节为2个十六进制数字。) 要在小端和大端之间转换,请看。这不是端转换。输出应该是0xEFBEADDE,而不是0xFEEBDAED。(仅交换字节,每个字节为2个十六进制数字。) 要在小端和大端之间转换,请看。小端反转的一般过程是: ((i&0xF0000000)>>28)

我想按如下方式转换无符号32位整数:


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系统上工作\