如何解决Linux Perl-十六进制值到十进制的转换
我正在开发一个脚本,用于将收集的十六进制(我不知道它们的位格式)值转换为十进制值。
示例之一是十六进制值:fef306da 如果将其转换,则会收到4277339866。
找到期望值的网站(带符号2的补码的十进制:): https://www.rapidtables.com/convert/number/hex-to-decimal.html
你们有解决方案,如何将十六进制fef306da转换为十进制-17627430。 注意:当我将十进制转换为带有(-)负号的十六进制时,会得到错误的值转换。
谢谢!
解决方法
查看pack,并对无符号和有符号的值使用修饰符。
Daily
A: 1
B: 1 (Only for the day it was received)
Weekly
A: 7
B: 1
Monthly
A: 30 (30 day month)
B: 4 (5 in some cases)
Yearly
A: 365
B: 52 (53 in some cases)
对每个十六进制值进行测试,以确定它是16位还是32位值。 然后将正确的修饰符与pack一起用于长值或短值。
,似乎您希望十进制为32位带符号整数,但是HEX($ n)返回64位 所以您可以尝试重新包装
perl -e 'print unpack "l",pack "L",hex( "fef306da" )'
,
如果您对二进制转换感兴趣,请检查以下代码(col_group col_flag col_seq
--------- -------- --------
A 1 1
A 1 2
A 1 3
A 0 3
A 0 3
B 1 4
B 1 1
B 1 2
B 1 3
B 0 3
B 1 4
B 1 1
C 1 2
C 0 2
...
是32位数字)
fef306da
输出
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;
,
您可以使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。