PHP 中按位解压

2023-12-03

我想通过一个奇怪的 8-8-8-7 位序列将一个二进制字符串解压到一个数组中。

对于正常的 8-8-8-8 序列,我可以轻松地执行类似的操作:

$b=unpack('C*',$data);
for ($i=0,$count=sizeof($b); $i < $count; $i+=4) {
$out[]=array($b[$i+1],$b[$i+2],$b[$i+3],$b[$i+4]);
}

这会给我一个 2D 字节数组,按 4 分组。

但由于第四个是 7 位,我想不出任何合适的东西。

你有什么想法吗?


不确定我是否完全理解,但如果您以未对齐/未填充的格式打包数据,您将需要使用某种比特流。

这是一个执行此操作的简单类。理想情况下,它应该是某种接受资源流的迭代器,但显示如何直接通过字符串执行此操作更简单:

class BitStream
{
  private $data, $byte, $byteCount, $bytePos, $bitPos;
  private $mask = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80];

  public function __construct($data)
  {
    $this->data = $data;
    $this->byteCount = strlen($data);
    $this->bytePos = 0;
    $this->bitPos = 7;

    $this->byte = $this->byteCount ? ord($data[0]) : null;
  }

  // reads and returns 1 bit. null on no more bits
  public function readBit()
  {
    if ($this->byte === null) return null;

    // get current bit
    $bit = ($this->byte & $this->mask[$this->bitPos]) >> $this->bitPos;

    if (--$this->bitPos == -1)
    {
      // advance to next byte 
      $this->bitPos = 7;
      $this->bytePos++;
      $this->byte = $this->bytePos < $this->byteCount ? ord($this->data[$this->bytePos]) : null;
    }

    return $bit;
  }

  // reads up to $n bits, where 0 < $n < bit length of max int
  // returns null if not enough bits left
  public function readBits($n)
  {
    $val = 0;
    while ($n--)
    {
      $bit = $this->readBit();
      if ($bit === null) return null;      

      $val = ($val << 1) | $bit;
    }

    return $val;
  }
}

然后使用它:

$bs = new BitStream($data);

$out = [];
while (true)
{
  $a = $bs->readBits(8);
  $b = $bs->readBits(8);
  $c = $bs->readBits(8);
  $d = $bs->readBits(7);

  if ($d === null) break; // ran out of data

  $out[] = [$a, $b, $c, $d];
}

The readBits()如果将其优化为一次最多读取 8 位,函数会更快,但按原样理解会更简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 中按位解压 的相关文章

  • WP 用户注册 - 也可以立即选择他/她的密码

    这是一个非常简短的前端注册指南 但我在密码方面遇到了一个小问题 我禁用了用户注册时发送的带有密码生成的电子邮件 Don t Send Notification Email To Registered User if function exi
  • 如何在 PHP 中替换/转义 U+2028 或 U+2029 字符以阻止我的 JSONP API 崩溃

    好的 我正在运行一个公共 JSONP API 数据由我的 PHP 服务器提供 我刚刚读了这篇文章 JSON 不是的 JavaScript 子集 作者 Magnus Holm 2011 年 5 月 http timelessrepo com
  • 如何在codeigniter中引用数据库连接?

    如何在 CodeIgniter 数据库处理程序对象中手动调用 PHP 数据库函数 如何检索连接 dbc 或者调用类似的函数mysql real escape string dbc variable 您可以调用任何 mysql 本机函数并访问
  • (Zend Framework > Zend_Config) 如何避免使用 .ini 或 .xml 配置?

    我认为对于高流量项目来说使用 ini 或 xml 文件不是一个好主意 因为每个页面加载都会导致解析 config ini 或 xml 文件 有什么方法可以用常规 php 数组替换使用 ini xml 作为配置吗 现在 php ini 看起来
  • 将子域重定向到 CakePHP 操作

    背景 我有一个 CakePHP 应用程序 位于 m 我想写一个根级别的 htaccess文件 它将重定向网站的 子域 作为操作的参数 例如 我想编写一个重写规则 这将导致像这样的重定向 http mysite myserver com ht
  • 使用 href 和 php 从 sql 数据库对 html 表进行排序

    我有一个 html 表 其中包含来自 php 吐出的 sql 表的产品数据 我想通过单击表列的标题对数据进行排序 我像这样输出我的表 php product list sql mysql query SELECT FROM products
  • PHP7 返回类型为 JSON

    PHP 7 有一个新功能 即返回类型声明 我们可以返回一个 字符串 类型 例如 function myFunction a string 我们还可以返回一个 数组 类型 例如 function myFunction a array 但是我们
  • 使用 PHP 正则表达式从字符串中提取年份[重复]

    这个问题在这里已经有答案了 我想从字符串中提取年份 我得到了一个不完整的解决方案 我的字符串总是这样 请将爵士乐 2014 和 2015 的 mpg 发送至我的手机号码 123456789 我尝试过以下正则表达式 preg match al
  • 在composer.json中运行命令行命令

    我正在尝试编写一个composer json 文件 该文件将连续运行多个命令行命令 作为一个示例 如下所示 scripts test createDir createDir mkdir testing 当我在终端中运行作曲家文件时使用com
  • MySQL 和 PHP:多关键字搜索

    我有一个包含逗号分隔关键字的字符串 例如 keywords keyword1 keyword2 keyword3 我的表架构 名为tbl address是这样的 简化的 id INT 11 PRIMARY KEY AUTO INCREMEN
  • PHP:__toString() 和 json_encode() 不能很好地协同工作

    我遇到了一个奇怪的问题 我不知道如何解决它 我有几个类 它们都是 JSON 对象的 PHP 实现 这是问题的说明 class A protected a public function construct this gt a array n
  • PHP:如何访问根目录之外的下载文件夹? [复制]

    这个问题在这里已经有答案了 我如何创建一个 PHP 脚本 页面 允许会员 买家下载存储在根目录之外的下载文件夹中的压缩文件 产品 我正在使用 Apache 服务器 请帮忙 谢谢 保罗 G 您可能会在 soac 提供的链接中找到一些更好的信息
  • 如何在 laravel/php 中访问该集合的内容

    我是 Laravel 的新手 正在做一个构建迷你社交网络应用程序的项目 我有一个与用户模型有关系的帖子模型 我有一个帖子页面 其中仅显示经过身份验证的用户及其朋友的帖子 在我的 PostController 中 我像这样查询经过身份验证的用
  • 生成 CloudFront 签名 URL 时性能缓慢

    我正在按照此示例使用 PHP 在 CloudFront 上创建签名 URLhttp docs aws amazon com AmazonCloudFront latest DeveloperGuide CreateURL PHP html
  • 如何在xampp中启用curl

    我面临下面给出的错误 致命错误 在第 11 行调用 E xampp htdocs new functions php 中未定义的函数curl init 我已经做出了改变php ini 我把前面的分号去掉了 extension php cra
  • 如何在 MySQL 中使用 INET_ATON 进行通配符搜索 IP 地址?

    我发现这个方法可以使用 INET ATON 将 IP 地址作为整数存储在 MySQL 数据库中 https stackoverflow com a 5133610 4491952 https stackoverflow com a 5133
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • 按时间戳字段中的日期过滤结果

    我已经获得了一些帮助 但不确定为什么这不起作用 我正在尝试使用表单让用户过滤他们的活动 存储在数据库中 My code GET from 01 11 2013 GET to 25 11 2013 from DateTime createFr
  • CodeIgniter:使用多维 POST 数据验证表单

    所以框架是CodeIgniter 2 0 2 我有一个表单 其中包含与数据库中的行相对应的字段组 字段名称的格式为 opt 0 foo opt 0 bar opt 1 foo opt 1 bar etc 索引 1 2等 并不对应于数据库中的
  • 在 Laravel 视图中使用 CSS?

    我刚刚开始学习 Laravel 并且可以掌握控制器和路由的基础知识 我的操作系统是 Mac OS X Lion 它位于 MAMP 服务器上 我的routes php代码 Route get function return View make

随机推荐

  • 如何在 ClickHouse 中向可执行 UDF 发送多个参数?

    我有一个输出输入的 python 脚本 usr bin python3 import sys if name main i 0 for line in sys stdin print i line end sys stdout flush
  • MySql REGEXP 运算符

    mySql REGEXP 运算符不区分大小写 该运算符是否有一个版本is区分大小写 Use the BINARY关键字 这迫使REGEXP将字符串匹配为二进制字符串 区分大小写 SELECT a REGEXP A a REGEXP BINA
  • Apache:禁用目录中的 php

    我想在我的服务器上的目录中禁用 php 我认为在 httpd conf 中设置 Options ExecCGI 会阻止执行 php 脚本 但显然我错了 所以 这就是我的 httpd conf 中的内容 它显然不起作用
  • ImportError:无法从“sklearn.base”导入名称“MultiOutputMixin”

    我只想用 scikit learn 进行线性回归 当我尝试导入线性模型包时 出现标题中的错误消息 我尝试遵循类似问题的解决方案 link 该建议基本上是删除请求 MultipleOutputMixin 的代码部分 当我这样做时 MultiO
  • 如何截取 YouTube 屏幕截图

  • 当用户关闭窗口选项卡时 JavaScript 发出警报

    我希望当用户关闭选项卡或窗口时 或者当他尝试移动到与我的站点不同的另一个位置时 弹出一个确认框 并且如果他确认执行 ajax 脚本 然后关闭或更改窗口 我不知道该怎么做 PS 我正在使用 jQuery window unload funct
  • 自定义 HtmlHelper 扩展方法在视图中不可用?

    我翻译了耶利米 克拉克的MVC 的复选框列表助手进入我的 VB Net 项目 但是当我尝试使用我认为的方法时 出现错误 CheckBoxList is not a member of System Web Mvc HtmlHelper Of
  • 如何以编程方式使折线图点处于活动/突出显示状态

    我使用的是 Chart js 2 0 beta2 页面和滑块上有几个折线图 我想突出显示每个折线图上与滑块位置匹配的数据点 它们都具有相同的点数 我不知道如何轻松地在代码中激活一个点 感谢您的任何提示 2 0 测试版解决方案 扩展您选择的图
  • 来自 JavaScript 的 JavaFX WebView 向上调用不起作用

    我有一个 JavaFX WebView 想要从 Web 视图中显示的 test html 调用 JavaBridge 类的方法 hello 为什么这不起作用 我确保 桥 对象仅在页面完全呈现时添加到 window object 因此这可能不
  • 能够在 print_r() 的输出中看到变量,但不确定如何在代码中访问它

    我用谷歌搜索 安装了 Devel Drupal for Firebug 但我找不到它 I found what我想要 我知道where这是 我只是不知道how为拿到它 为实现它 我将把它放在代码括号中 但 Devel 告诉我文件名 我想将其
  • 如何打印字符串中的每个字符?

    有没有一种方法可以一次从输入中读取一个字符并对其进行处理 而不需要对词汇进行标记 字符串上的 toCharArray 函数在这里可能很有用 for char c s toCharArray System out println c 并仅打印
  • 广播接收器作为 Android 中的内部类

    在我的代码中有一个扩展的内部类BroadcastReceiver 我已将以下行添加到AndroidManifest xml
  • 导入库项目时出现 NoClassDefFoundError

    我目前正在使用版本 4 6 1 Windows Vista Eclipse 编写一个单元测试项目 我的项目分为 3 部分 A 单元测试应用程序 类型 CLDC应用程序 B 待测试应用 类型 CLDC应用 C 一个库项目 类型 library
  • Portlet 中的 YUI 版本冲突问题

    我正在从 portlet 加载 yui js 3 3 0 版本文件 但 liferay 使用 3 2 0 yui js 文件 所以每当我加载该页面时 就会出现 js 错误 G ENV loaded VERSION 未定义 此错误出现在 yu
  • Struts2教程不起作用

    我正在学习struts2 我根据以下内容尝试我的 hello world 项目tutorial然后我在 eclipse 中运行代码 但这不起作用 控制台显示很多错误 第一个如下 com opensymphony xwork2 util lo
  • Iss 声明无效 Keycloak

    我使用 keycloak 服务登录我的网络应用程序 用作具有 oauth 2 0 安全性的后端 spring 当我使用从 keycloak 获得的不记名令牌向邮递员发出请求时 它给了我一个错误 401 并且也在旁边的答案文本中www Aut
  • 通过安全规则中的某个子值限制查询

    我正在努力想出构建部分数据库及其相关安全规则的最佳方法 我有聊天组 并且可以随时将用户添加到这些组中 当用户添加到组中时 他们应该只能检索发送的消息after那 他们不应该检索在他们 用户 添加到组之前发送的任何消息 我的第一种方法错误地假
  • 是否可以在离子侧边栏中使用幻灯片

    我正在用 ionic 构建一个移动应用程序 我想通过放置幻灯片来制作一个类似松弛的侧面菜单 例如 当您单击主菜单项时 它将像 slack 一样在侧菜单中滑出另一张幻灯片 我尝试在离子菜单中使用离子幻灯片 但幻灯片不起作用 请查看屏幕截图 这
  • C++17 中的通用工厂机制

    我想为一组派生类实现一个通用工厂机制 它不仅允许我通用地实现工厂函数来创建该类的对象 而且还允许其他模板类的创建者将派生类之一作为模板参数 理想情况下 解决方案将仅使用 C 17 功能 无依赖项 考虑这个例子 include
  • PHP 中按位解压

    我想通过一个奇怪的 8 8 8 7 位序列将一个二进制字符串解压到一个数组中 对于正常的 8 8 8 8 序列 我可以轻松地执行类似的操作 b unpack C data for i 0 count sizeof b i lt count