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
你可以使用 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
我正在开发一个脚本,将收集的 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
你可以使用 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