php - Pack 将字节数组转换为 UINT64
问题描述
我想使用 PHP 将字节数组转换为 UINT64。
我可以在 C# 中轻松地做到这一点,但我想在 PHP 中做到这一点。
这是 C# 代码。
bytes = Encoding.UTF8.GetBytes(hashed);
BitConverter.ToUInt64(bytes, 0);
我想将其转换为 PHP。
我尝试使用pack()
功能,但这不起作用。
假设这是一个字节数组。
$bytes = [101,102,54,55,99,55,56,49];
pack("J*","101","102","54","55","99","55","56","49");
这显示了一个警告。
epack():在线未使用的 7 个参数
我怎样才能解决这个问题?
解决方案
这里的主要问题(如果我理解正确的话)是您使用 PHP 数字来表示字节数组,但是unpack
需要输入字符串。如果您保持数组不变,那么 PHP 似乎只是将数字转换为字符串,这意味着 101 将是 '101',而 101 又是 3 个字节,这会破坏整个过程。
您需要先将数字转换为字节。一个字节本质上是一个,unsigned char
因此您可以首先将数组打包成无符号字符,然后将它们解包:
$bytes = [101,102,54,55,99,55,56,49];
$unpacked = unpack("J", pack('C*', ...$bytes));
echo current($unpacked);
解释:
C
是 unsigned char 的包代码,*
表示您需要使用所有数组条目。这将根据数组生成一串字符。J
然后,您可以使用(如果您知道字节是以大端字节顺序生成的事实)或者P
如果您知道字节是以小端顺序生成的,或者Q
如果您想使用机器顺序来解压缩此字符串。如果字节是在同一台机器上生成的,那么Q
可能是一个更好的选择,而不是J
你需要知道字节序。
示例:http ://sandbox.onlinephpfunctions.com/code/5cba2c29522f7b9f9a0748b99fac768012e759ce
注意:这是我个人对正在发生的事情的理解,因此任何有更好的打包/解包知识的人都可以让我知道我是否弄错了。
推荐阅读
- javascript - 为什么我的 Node.js 应用程序会崩溃,尽管我设置了 --max-old-space-size?
- regex - 正则表达式返回一组中的所有匹配项
- python - 如何根据条件交换 2 行中的选定数据
- javascript - 如何仅触发被点击的事件?
- android - 手动安装 Android SDK 工具 - Google Play Service
- python - 在这个例子中如何打印张量流张量值?
- c# - 在 ASP.NET 中重定向和添加新参数
- mysql - 如何使用索引表 MariaDB 改进慢查询?
- excel - 有没有办法从 Excel Addin 将宏插入工作表?
- python - 合并多索引时,pandas 不会为冲突列添加后缀