PHP:从二进制数据中的任意偏移位置读取任意数量的位

PHP:从二进制数据中的任意偏移位置读取任意数量的位,php,binary,bit-manipulation,Php,Binary,Bit Manipulation,我有一些二进制数据,它有一个对应的映射文件,通过提供位偏移量和长度来标识二进制数据中的每个数据点。因此,我可能有以下映射: $paths = array ( "path1" => array ("offset" => 224, "size" => 2), "path2" => array ("offset" => 226, "size" => 6), ); 实际上,我有成千上万个这样的路径来进行偏移/大小映射。现在,给定一条

我有一些二进制数据,它有一个对应的映射文件,通过提供位偏移量和长度来标识二进制数据中的每个数据点。因此,我可能有以下映射:

$paths = array ( "path1" => array ("offset" => 224, "size" => 2),
                 "path2" => array ("offset" => 226, "size" => 6),
);
实际上,我有成千上万个这样的路径来进行偏移/大小映射。现在,给定一条路径,我希望能够找到合适的偏移量,并读取大小给定的位数。在这个简单的例子中,path1和path2表示一个字节,其中path1是前2位,path2是最后6位

我已经用Python编写了这篇文章,现在正在将代码移植到PHP,原因如下:

无论如何,对于整字节偏移量下的整字节大小,我可以使用带有适当格式字符串的解包。我的问题是如何处理这些奇怪大小的比特集

到目前为止,我想到的唯一方法是找到最近的位偏移量,其中偏移模数8给出0个整字节,并且小于给定的偏移量,然后从包含所有所需位的新偏移量中再次找到整字节大小中的最小值,然后使用逐位&来屏蔽我想要的位

在Python中,我可以使用bitbuffer模块,它允许我寻找一个位偏移量,然后读取任意数量的位。在PHP世界里有类似的事情吗


谢谢。

您的解决方案是先抓取整个字节,然后使用位掩码,这听起来像是一种方法。那么我想你也应该做一个右移,因为你感兴趣的位可能没有结束在字节边界上


这将是一个缓慢的方法,但我不知道有任何内部PHP函数可以做这种事情。

这是我害怕的答案。我会想象做一些类似0xffff>32-$rightoffset的事情来创建位掩码-哦,注意,在64位PHP上,您的INT将是64位的,因此可能需要修改上面的内容。请注意,如果PHP中没有库函数,那么在PHP中执行任何类型的二进制处理都会很慢,我99%肯定不会有,我只是不知道有这样的可能性。