24位int in php

Posted

技术标签:

【中文标题】24位int in php【英文标题】:24bit int in php 【发布时间】:2012-06-21 23:49:48 【问题描述】:

大家好,所以我遇到了一点问题,我必须从 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.

以前有没有人处理过这个问题?有什么解决办法吗?建议?

【问题讨论】:

速度是否非常重要,或者即使不是最快的,您也可以接受一个简单的解决方案? 你不能只用一个空字节填充它吗?喜欢$buffer = unpack("N", "\x00$data"); 感谢戴夫,这似乎奏效了! 【参考方案1】:

如果文件只有上面的 3 个字节,最简单的方法是像 @DaveRandom 所说的那样填充。但是如果是长文件,这种方法就变得低效了。

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

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

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 位的字符串

【讨论】:

以上是关于24位int in php的主要内容,如果未能解决你的问题,请参考以下文章

2022-04-24:位集 Bitset 是一种能以紧凑形式存储位的数据结构。 请你实现 Bitset 类。 Bitset(int size) 用 size 个位初始化 Bitset ,所有位都是 0

What does "size" in int(size) of MySQL mean?

Integer.toHexString(byte & 0xFF)

1——数据类型和序列类型(基础)

在纯python中以间隔分割24位深度wav声音

JAVA中int强制转换byte