如何将二进制字符串转换为unsigned int?
我正在做
$id = unpack('V', substr($dir, $mid * 12, 4))[1];
echo $id . '<br/>';
Run Code Online (Sandbox Code Playgroud)
V根据文件,在哪里
unsigned long(总是32位,小端字节顺序)
它打印-992455690.这怎么可能?
更新:在文档中找到:
请注意,PHP在内部将整数值存储为signed.如果解压缩一个大的unsigned long并且它与PHP内部存储的值大小相同,那么即使指定了unsigned解包,结果也将为负数.
所以现在的问题是,V如果格式与签名版本相同,那么格式的重点是什么,而不是造成混淆?
不幸的是,对于 32 位 PHP 发行版(正如您的版本所示),并且本机机器字节序是 intel 'little-endian',答案似乎是:V与l!
对于 PHP 的 64 位发行版,V如果对以允许访问 4 字节有符号值的系统/语言编码的二进制字符串进行解码,则该格式允许开发人员检索有用的信息 - 但是您的问题会向上转化为“什么是如果与签名版本相同,则具有P适用于 64 位机器的格式。
除此之外,我建议所使用的格式还为任何阅读开发人员提供有关代码意图的有用信息,因为(如果使用 转换回二进制字符串pack())负数的二进制表示将与原始无符号数。如果开发人员知道他们将处理允许值的极端范围内的整数,那么他们应该知道这一点,以便能够(手动)正确处理溢出/下溢情况。
另外,可能值得注意的是,提供这些代码的包手册仅为有符号值的格式提供了一个代码,这些格式始终是机器字节顺序,而无符号值的格式除了允许指定特定的字节顺序之外,还允许指定特定的字节顺序。机器订单。因此,如果您希望解码本地存储在 intel(小端)32 位 php 发行版上的 ARM(大端)上的有符号 16 位值而不操纵字节顺序,则必须首先解码为无符号 16 位大端字节序,如果结果数字超过此值,则手动减去 2^15。