【发布时间】:2018-11-13 00:55:01
【问题描述】:
在其他一些语言中,这个问题是一个简单的转换问题。在 PHP 中没有这样的概念,因为所有整数都具有相同的类型(signed long long 或signed long,取决于体系结构)。然而,在某些情况下你必须这样做。例如。 unpack() 无法读取 signed long little endian 字节顺序,只有无符号。
那么,给定一个 imaginary 32 位无符号整数 4294967295,我如何从中获取 imaginary 有符号 32 位整数的值? (那是-1。)
例如,this can be done with pack/unpack,但这对我来说似乎不是最理想的。
有没有更好的方法?
32 位版本的 PHP 怎么样? (他们倾向于通过整数溢出“自动”解决这个问题,但我宁愿不使用这种依赖于架构的解决方法。Background.)
【问题讨论】:
-
“获取一个有符号的 16 位整数”并没有多大意义,因为正如你所说,PHP 没有那种数字。您所得到的只是另一个具有不同值的 32/64 位整数。您想将 32 位有符号整数的字节表示解释为 16 位整数...?
-
'将 32 位 unsigned int 的字节表示解释为 16bit signed int' - 就是这样 (this issue)
-
所以只需修复您的代码:github.com/pear/OLE/blob/… 只需使用另一种格式
unpack("v", fread($fh, 4));php.net/manual/en/function.pack.php -
@Alex 你建议解压成一个有符号的值并希望最好的,例如溢出?如果没有发生怎么办?
-
我建议有适当的设计和定义的数据流。您的数据来自某个流,我们唯一应该做的就是按照设计的方式读取流数据。
标签: php