【问题标题】:What does performing a byteswap mean? [duplicate]执行字节交换是什么意思? [复制]
【发布时间】:2014-11-06 07:08:13
【问题描述】:

有几十个地方在讨论如何进行不同类型的字节交换,但我无法轻易找到解释这个概念的地方以及一些关于如何需要字节交换的典型示例。

所以问题来了:什么是字节交换,为什么/什么时候需要这样做?

如果示例是一种很好的解释方式,那么如果它们在标准 C++ 中使用,我会很高兴。参考书籍值得赞赏,优先考虑 Lippman 或 Pratas C++ 的入门书,因为这些是我可用的。

【问题讨论】:

标签: c++


【解决方案1】:

如 cmets 中所述,字节交换是将值 endianess 从一个更改为另一个的过程。假设您的内存中有一个值(左地址最低):

DE AD BE EF   <- big endian

这个值由 4 个字节组成 - 在十六进制表示中,两个数字是一个字节。

如果我们现在假设上面的值是用大端编码的,那么这意味着如果内存中的第一个字节是最低字节 - 这里是DE。 Intel x86 处理器架构使用 little endian,这意味着与上面相同的值在内存中看起来像这样:

FE BE AD DE   <- little endian

这两个值代表相同的值,但具有不同的字节序。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您说的是 big endianlittle endian 的转换和返回。

    这是因为一些微处理器使用little endian 格式来引用内存,而其他微处理器使用big endian 格式。

    例如,互联网上的字节流是 big endian,而您的英特尔 CPU 使用 little endian 格式。

    因此要从网络转换为 CPU 或从 CPU 转换为网络,我们需要一种称为字节交换的转换机制。

    操作系统为此提供了ntohl()htonl() 函数。

    【讨论】:

    • 或者ntohs/htons,如果你想字节交换一个short而不是一个long(在这个上下文中被假定为2x8位和4x8位)
    • 非常感谢!那是我需要的缺失链接。我正在阅读一些用 VS 编写的 c++ 代码(不是我写的),现在我尝试用 gcc 进行编译。然后我发现了一些我无法理解的 _byteswap_DATATYPE() 风格的微软特定(我认为)宏。
    • 注意:字节交换指令 (bswap reg) 与字节序转换不同。事实上,如果主机已经使用网络字节顺序,则无需执行任何操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2019-09-12
    • 2015-01-22
    • 2020-10-27
    • 2015-07-15
    • 2018-07-17
    • 2012-08-13
    相关资源
    最近更新 更多