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}吗?
代码工作,但真的让我感到困惑.是不是我理解错了?
查看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