这个字节序转换正确吗?

5

我正在阅读一个库 (github.com/adduc/phpmodbus),其中有一个函数用于将整数转换为小端或大端的字节串:

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));
}
iecBYTE函数就是chr($value & 0xFF)
现在我可能有点笨,但字节序看起来不对。
例如,对于0xAABBCCDD,你会得到{CC}{DD}{AA}{BB}
我甚至在维基百科上查过。难道不应该是{DD}{CC}{BB}{AA}吗?
但这个代码可以工作,这真的让我很困惑。它是正确的,还是我理解错误了?

1
你所说的“它工作了”是什么意思?也许它只是“工作了”,但并没有正确地工作? - imtheman
也许我误解了这个方法在做什么,不太确定。这个方法在库中被广泛使用,并且它能正常工作。 - MightyPork
2个回答

0

你说得对。虽然函数很接近正确,但它并不正确。看起来你只需要交换一些转换即可。从逻辑上讲,小端转换($endianness == 0)只是大端转换($endianness != 0)的反转。

private static function endianness($value, $endianness = 0) {
    if ($endianness == 0) //little-endian
        return
                self::iecBYTE($value & 0x000000FF) .
                self::iecBYTE(($value >> 8) & 0x000000FF) .
                self::iecBYTE(($value >> 16) & 0x000000FF) .
                self::iecBYTE(($value >> 24) & 0x000000FF);
    else //big-endian
        return
                self::iecBYTE(($value >> 24) & 0x000000FF) .
                self::iecBYTE(($value >> 16) & 0x000000FF) .
                self::iecBYTE(($value >> 8) & 0x000000FF) .
                self::iecBYTE(($value & 0x000000FF));
}

0
在查看IECType.php之后,我注意到它正在将PHP类型转换为IEC 1131类型。 小端存储的是最不重要的字节。你所描述的会让我想到这个系统正在使用16位地址。
如果您查看上面评论中引用的Endianess的wiki,则会看到一个称为原子元素大小16位的Little-endian下的部分。一个地址保存两个字节(CCDD)和(AABB)。保存(CCDD)的地址是最不重要的,因此它会被列在第一位。
如果您在8位系统中工作,则每个字节都会按顺序排列(DDCCBBAA),因为每个地址只有一个字节。
维基对于您在endianess函数中观察到的内容进行了描述。
address1| address2
16-bits | 16-bits
 CCDD   |  AABB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接