将字节数组打包成UINT64

Pack Convert byte array into 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 arguments unused on line

我该如何解决这个问题?

这里的主要问题(如果我理解正确的话)是您使用 PHP 数字来表示字节数组,但是 unpack 需要输入字符串。如果你保持数组原样,那么 PHP 似乎只是将数字转换为字符串,这意味着 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

注意:这是我个人对正在发生的事情的理解,所以如果我有什么不对的地方,pack/unpack 知识渊博的人可以告诉我。