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
相关产品推荐
相关产品推荐

