Linux Peel - 将十六进制值转换为十进制

Linux Perl - Convertion of Hex Value to Decimal

我正在开发一个脚本,将收集的 HEX(我不知道它们的位格式)值转换为十进制值。

其中一个例子是十六进制值:fef306da 如果我转换它,我会收到 4277339866。

我找到预期值的网站(带符号 2 的补码的小数:): https://www.rapidtables.com/convert/number/hex-to-decimal.html

你们有解决办法吗我怎样才能把十六进制的fef306da转换成十进制的-17627430。 注意:当我转换十进制时有 (-) 负号的十六进制时,我得到错误的值转换。

谢谢大家!

查看 pack 并对无符号和有符号值使用修饰符。

my $hex_value = "fef306da";
my $output_num = unpack('l', pack('L', hex($hex_value)));
print $output_num; ## -17627430

对每个十六进制值执行测试以确定它是 16 位还是 32 位值。 然后将正确的修饰符与 pack 一起用于长值或短值。

您似乎希望小数是 32 位有符号整数,但是 HEX($n) returns 是 64 位的 所以你可以尝试重新打包

perl -e 'print unpack "l", pack "L", hex( "fef306da" )'

如果您对二进制转换感兴趣,请检查以下代码(fef306da 是 32 位数字)

use strict;
use warnings;
use feature 'say';

my $input   = 'fef306da';
my $hex     = hex($input);
my $dec;

if( $hex & 0x80000000 ) {
   $dec = -1 * ((~$hex & 0x7fffffff)+1);
} else {
   $dec = $data;
}

say $dec;

输出

-17627430

提示:Two's complement

你可以使用 pack

my $hex = "fef306da";
my $num = hex($hex);
$num = unpack("l", pack("L", $num));
say $num;  # -17627430

my $hex = "fef306da";
$hex = substr("00000000$hex", -8);   # Pad to 8 chars
my $num = unpack("l>", pack("H8", $hex));
say $num;  # -17627430

但简单的算术就可以了。

my $hex = "fef306da";
my $num = hex($hex);
$num -= 0x1_0000_0000 if $num >= 0x8000_0000;
say $num;  # -17627430