【发布时间】:2014-11-06 07:08:13
【问题描述】:
有几十个地方在讨论如何进行不同类型的字节交换,但我无法轻易找到解释这个概念的地方以及一些关于如何需要字节交换的典型示例。
所以问题来了:什么是字节交换,为什么/什么时候需要这样做?
如果示例是一种很好的解释方式,那么如果它们在标准 C++ 中使用,我会很高兴。参考书籍值得赞赏,优先考虑 Lippman 或 Pratas C++ 的入门书,因为这些是我可用的。
【问题讨论】:
标签: c++
有几十个地方在讨论如何进行不同类型的字节交换,但我无法轻易找到解释这个概念的地方以及一些关于如何需要字节交换的典型示例。
所以问题来了:什么是字节交换,为什么/什么时候需要这样做?
如果示例是一种很好的解释方式,那么如果它们在标准 C++ 中使用,我会很高兴。参考书籍值得赞赏,优先考虑 Lippman 或 Pratas C++ 的入门书,因为这些是我可用的。
【问题讨论】:
标签: c++
如 cmets 中所述,字节交换是将值 endianess 从一个更改为另一个的过程。假设您的内存中有一个值(左地址最低):
DE AD BE EF <- big endian
这个值由 4 个字节组成 - 在十六进制表示中,两个数字是一个字节。
如果我们现在假设上面的值是用大端编码的,那么这意味着如果内存中的第一个字节是最低字节 - 这里是DE。 Intel x86 处理器架构使用 little endian,这意味着与上面相同的值在内存中看起来像这样:
FE BE AD DE <- little endian
这两个值代表相同的值,但具有不同的字节序。
【讨论】:
如果我正确理解您的问题,您说的是 big endian 到 little endian 的转换和返回。
这是因为一些微处理器使用little endian 格式来引用内存,而其他微处理器使用big endian 格式。
例如,互联网上的字节流是 big endian,而您的英特尔 CPU 使用 little endian 格式。
因此要从网络转换为 CPU 或从 CPU 转换为网络,我们需要一种称为字节交换的转换机制。
操作系统为此提供了ntohl() 和htonl() 函数。
【讨论】:
ntohs/htons,如果你想字节交换一个short而不是一个long(在这个上下文中被假定为2x8位和4x8位)
bswap reg) 与字节序转换不同。事实上,如果主机已经使用网络字节顺序,则无需执行任何操作。