You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现按小端位序将二进制字符串转为十六进制的方法

PHP实现按最低有效位优先的二进制字符串转十六进制

我有一个长度为8的倍数的二进制字符串,示例如下:

$fullNameBin = "01010001000010110110010000010011000110000111100011001011111110110100111100111100";

需要将其转换为十六进制,注意每个字节的位是按最低有效位到最高有效位的顺序排列,转换后的预期结果为:

$fullNameCoded = "8AD026C8181ED3DFF23C";

Perl中已有两种可行实现:
第一种:

my $fullNameCoded = "";
for ( unpack( '(A8)*', $fullNameBin ) ) {
   $fullNameCoded .= sprintf( "%02X", oct( "0b" . reverse( $_ ) ) );
}

第二种:

my $fullNameCoded = uc unpack 'H*', pack 'b*', $fullNameBin;

但我尝试的PHP代码未能成功:

foreach ( unpack( "A8*", $fullNameBin) as $item ) {
   $fullNameCoded .= sprintf( "%02X", octdec( "0b" . strrev( $item ) ) );
}

正确实现方法

方法一:修正原有代码逻辑

你之前的代码核心错误在于使用了octdec()函数——这个函数用于转换八进制字符串为十进制,而我们需要处理的是二进制字符串,应替换为bindec()函数。修正后的代码如下:

$fullNameBin = "01010001000010110110010000010011000110000111100011001011111110110100111100111100";
$fullNameCoded = "";

foreach (unpack("A8*", $fullNameBin) as $item) {
    // 反转每个8位字节的位顺序,转换为十进制后格式化为两位大写十六进制
    $fullNameCoded .= sprintf("%02X", bindec(strrev($item)));
}

echo $fullNameCoded; // 输出:8AD026C8181ED3DFF23C

方法二:模拟Perl的pack 'b*'行为

如果想更贴近Perl的简洁写法,可以先将每个8位块反转,拼接成标准位序的二进制字符串,再转换为十六进制:

$fullNameBin = "010100010000101101100100000100110001100001111000110001101111110110100111100111100";

// 按8位拆分字符串,反转每个块后重新拼接
$reversedBin = implode('', array_map('strrev', str_split($fullNameBin, 8)));
// 将二进制字符串转十六进制并转为大写
$fullNameCoded = strtoupper(bin2hex(pack('H*', base_convert($reversedBin, 2, 16))));

echo $fullNameCoded; // 输出:8AD026C8181ED3DFF23C

内容的提问来源于stack exchange,提问作者Neavehni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:54:24