我最近写了一个脚本,它解析了单个二进制字节月字段的文本表示。
(不要问: - {)
在摆弄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个数字,但还有更好的方法吗?
答案 0 :(得分:28)
如果你有
$hex_string = "0x10";
你可以使用:
$hex_val = hex($hex_string);
你会得到:$hex_val == 16
hex
不需要字符串开头的“0x
”。如果它丢失了,它仍然会将十六进制字符串转换为数字。
您还可以使用oct
将二进制,八进制或十六进制字符串转换为基于前缀的数字:
0b
- 二进制0
- 八进制0x
- hex 答案 1 :(得分:7)
#!/usr/bin/perl
use strict;
use warnings;
my @months = map hex, qw/x01 x02 x03 x04 x05 x06 x07 x08 x09 x0a x0b x0c/;
print "$_\n" for @months;
答案 2 :(得分:3)
如果我理解正确,你每月有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);