【问题标题】:Cast unsigned long into signed short in PHP在 PHP 中将 unsigned long 转换为 signed short
【发布时间】: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


【解决方案1】:

首先,这可以通过pack/unpack 来完成:

$value = 4294967295;
$result = unpack("l", pack('L', $value));
var_dump($result[1]); // -1

Try live.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多