首页 > 解决方案 > 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 个参数

我怎样才能解决这个问题?

标签: phpuint

解决方案


这里的主要问题(如果我理解正确的话)是您使用 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

注意:这是我个人对正在发生的事情的理解,因此任何有更好的打包/解包知识的人都可以让我知道我是否弄错了。


推荐阅读