我最近编写了一个脚本,它解析单个二进制字节月份字段的文本表示。
(不要问:-{)
摆弄了 sprintf 一段时间后,我放弃了,做了这个;
our %months = qw / x01 1
x02 2
x03 3
x04 4
x05 5
x06 6
x07 7
x08 8
x09 9
x0a 10
x0b 11
x0c 12 /;
...
my $month = $months{$text};
我侥幸逃脱了惩罚,因为我只使用了 12 个数字,但是有更好的方法吗?
如果你有
$hex_string = "0x10";
您可以使用:
$hex_val = hex($hex_string);
你会得到:
$hex_val == 16
hex
不需要字符串开头有“0x
”。如果丢失,它仍然会将十六进制字符串转换为数字。
您还可以使用
oct
根据前缀将二进制、八进制或十六进制字符串转换为数字:
0b
- 二进制0
- 八进制0x
- 十六进制如果我理解正确的话,你每月有 1 个字节 - 不是字符串“0x10”,而是包含 10 的字节。
这样,你应该使用unpack:
my $in = "\x0a";
print length($in), "\n";
my ($out) = unpack("c", $in);
print length($out), "\n", $out, "\n"
输出:
1
2
10
如果输入的是3个字符,比如“x05”,那么更改也很简单:
my $in = "x0a";
my $out = hex($in);
这是另一种可能更实用的方法,可以直接转换字符串中包含的十六进制。
这利用了 s/// 上的
/e
(e 表示 eval)正则表达式修饰符。
从该字符串开始:
$hello_world = "\\x48\\x65\\x6c\\x6c\\x6f\\x20\\x57\\x6f\\x72\\x6c\\x64";
十六进制转字符:
print $hello_world =~ s/\\x([0-9a-fA-F]{2})/chr hex $1/gre;
十六进制转十进制数:
print $hello_world =~ s/\\x([0-9a-fA-F]{2})/hex $1/gre;
删除
/r
修饰符以就地替换字符串。
有一天,我使用了一个 Python 脚本来处理二进制文件,但我被一个只包含十六进制数字的字节文字 (b'\x09\xff...') 困住了。
我设法用上面的一种变体的单行取回了我的字节。