【问题标题】:PHP - read 8 bit integersPHP - 读取 8 位整数
【发布时间】:2011-08-15 04:34:38
【问题描述】:

我有一个全是 8 位整数的二进制文件。我曾尝试使用 php unpack() 函数,但我无法让任何参数适用于 1 字节整数。我试图将数据与一个虚拟字节结合起来,以便我可以使用“n”/“v”参数。我正在使用 Windows 机器来执行此操作。最终,我想要一个函数来返回一个基于 8 位二进制整数字符串的整数数组。我尝试过的代码如下 -

$dat_handle = "intergers.dat";
$dat_file = fopen($dat_handle, "rb");
$dat_data = fread($dat_file, 1);
$dummy = decbin(0);
$combined = $dummy.$dat_data;
$result = unpack("n", $combined);

【问题讨论】:

  • "n" 是 unsigned short —— 16 位。当然,如果您将其读取为 16 位 int,则读取 8 位 int 将会失败;)。试试unpack("c", $combined);
  • @Frank 他的想法实际上是合理的(假设是无符号数据),他的执行是错误的。他应该在前面加上chr(0),而他却在前面加上'0'。也就是说,这仍然是错误的做法!
  • 你说得对:decbin返回一个包含字符“0”的PHP字符串,这根本不是他想要的。

标签: php binary integer pack unpack


【解决方案1】:

您正在寻找的是 char 数据类型。现在有两个版本,有符号(小写c)和无符号(大写C)。只需使用适合您数据的那个即可。

<?php
    $byte = unpack('c', $byte);
?>

另外,如果数据文件只是一堆字节,没有别的,而且你知道它的长度,你可以这样做。 (如果长度是连续 16 个有符号字符。)

<?php
    $bytes = unpack('c16', $byte);
?>

如果您不知道文件中有多少字节,但您知道只有字节,您可以使用星号代码读取直到 EOF。

<?php
    $bytes = unpack('c*', $byte);
?>

【讨论】:

    【解决方案2】:

    以下应该做你想做的事 (ord):

    $dat_handle = "intergers.dat";
    $dat_file = fopen($dat_handle, "rb");
    $dat_data = ord(fread($dat_file, 1));
    

    您要做的是检索单个字节的整数值。因为您一次读取单个字节,所以您将始终只有一个有效的 ASCII 字符。 ord 返回那个字符的二进制值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多