php中的24位int

时间:2012-06-21 23:49:49

标签: php pack unpack 24-bit

嘿所有这些我遇到了一些问题,从PHP我必须从二进制文件中读取一些数据,其中SPACE是最重要的,所以他们在地方使用了24位整数。

现在我可以用unpack读取大部分数据但是pack / unpack不支持24位int:s

我想我也许可以简单地将数据读取(例如000104)作为H *并将其读入一个正确的var。

// example binary data say I had the following 3 bytes in a binary file
// 0x00, 0x01, 0x04

$buffer = unpack("H*", $data);

// this should equate to 260 in base 10 however unpacking as H* will not get
// this value.

// now we can't unpack as N as it requires 0x4 bytes of data and n being a 16 bit int
// is too short.

以前有人不得不处理这件事吗?有解决方案吗建议?

1 个答案:

答案 0 :(得分:0)

如果文件只有3个字节,最简单的方法是填充@DaveRandom说。但如果它是一个长文件,这种方法效率低下。

在这种情况下,您可以将每个元素作为char和short读取,然后通过按位运算符重新打包。

或者您可以将12个字节读取为3个长整数,然后使用按位运算符将其拆分为4个3个字节的组。其余字节将由上述两种方法提取。这将是大数据的最快解决方案。

unsigned int i, j;
unsigned int dataOut[SIZE];

for (i = 0, j = 0; j < size; i += 4, j += 3)
{
    dataOut[i]     = dataIn[j] >> 8;
    dataOut[i + 1] = ((dataIn[j] & 0xff) << 16) | (dataIn[j + 1] >> 16);
    dataOut[i + 2] = ((dataIn[j + 1] & 0xffff) << 8) | (dataIn[j + 2] >> 24);
    dataOut[i + 3] = dataIn[j + 2] & 0xffffff;
}

以下question有一个示例代码来解压缩24/48位字符串