此字节顺序转换是否正确?

Mig*_*ork 5 php modbus endianness

我正在阅读一个库(github.com/adduc/phpmodbus),这个函数用于将整数转换为little-endian或big-endian字节串:

private static function endianness($value, $endianness = 0) {
    if ($endianness == 0)
        return
                self::iecBYTE(($value >> 8) & 0x000000FF) .
                self::iecBYTE(($value & 0x000000FF)) .
                self::iecBYTE(($value >> 24) & 0x000000FF) .
                self::iecBYTE(($value >> 16) & 0x000000FF);
    else
        return
                self::iecBYTE(($value >> 24) & 0x000000FF) .
                self::iecBYTE(($value >> 16) & 0x000000FF) .
                self::iecBYTE(($value >> 8) & 0x000000FF) .
                self::iecBYTE(($value & 0x000000FF));
}
Run Code Online (Sandbox Code Playgroud)

iecBYTE函数是chr($value & 0xFF).

现在也许我很厚,但是小端字符串看起来不对.
例如,0xAABBCCDD你会得到{CC}{DD}{AA}{BB}.

我甚至在维基百科上查了一下.不应该{DD}{CC}{BB}{AA}吗?

代码工作,但真的让我感到困惑.是不是我理解错了?

Dan*_*ale 0

查看IECType.php后,我注意到它将 PHP 类型转换为 IEC 1131 类型。Little endian 首先存储最低有效字节。你的描述会让我认为系统正在使用 16 位地址。

如果您查看endianess 函数上方注释中引用的 Endianess wiki ,那么您将在 Little-endian 下看到一个名为 Atomic element size 16-bit 的部分。一个地址包含两个字节(CCDD)和(AABB)。保存 (CCDD) 的地址是最不重要的,因此它将首先列出。

如果您在 8 位系统中工作,那么每个字节都会被排序 (DDCCBBAA),因为每个地址都有一个字节。

Wiki 描述了您在 endianess 函数中看到的内容。

地址1| 地址2
16 位 | 16位
 CCDD | AABB