首页 > 解决方案 > 添加十六进制值时,将一组位乘以 256 有什么用?

问题描述

我目前正在尝试解码十六进制有效负载以从中提取值。要转换的值是 0x7608。但是,我没有得到应该是 16 位整数的所需结果。使用的编程语言是 PHP。

$hex="7608";
$left_part="76";
$right_part="08";

$left_part_to_decimal= hexdec($left_part);
$right_part_to_decimal=hexdec($right_part);

$result=(left_part_to_decimal<<8)|($right_part_to_decimal);

实际结果是 30216。但是我得到了一段代码,结果的计算应该如下:

$result=($left_part_to_decimal & 0xFF) + ($right_part_to_decimal & 0xFF) * 256;

这导致预期结果为 2166。

30216 是错误的,我似乎无法弄清楚为什么。

标签: phphexbit-shift

解决方案


如果您期望 0x7608 为 2166,则交换字节。“08”是高字节,“76”是低字节。

$hex="7608";
$bitStr = hex2bin($hex);  //same as "\x76\x08"

$integer = ord($bitStr[1]) * 256 +  ord($bitStr[0]); //2166

解包功能具有 16 位的两种变体。你也可以这样做:

$integer = unpack('v', $bitStr)[1];

推荐阅读