我是Perl的新手,我在使用不同类型时遇到了困难。
我试图获得一个十六进制寄存器,将其转换为二进制,使用它一个字符串,并从二进制字符串中获取子串。
一世 …
您正在使用十六进制格式分配整数值。 print 默认情况下以十进制格式打印数字,因此您将获得64031。
print
您可以使用printf()通过提供不同的格式来验证这一点。
$ perl -e ' my $num = 0xFA1F; printf("%d %X %b\n", ($num) x 3 ) ' 64031 FA1F 1111101000011111 $ perl -e ' my $num = 64031; printf("%d %X %b\n", ($num) x 3 ) ' 64031 FA1F 1111101000011111 $ perl -e ' my $num = 0b1111101000011111; printf("%d %X %b\n", ($num) x 3 ) ' 64031 FA1F 1111101000011111 $
要在字符串中获取0xFA1F的二进制格式,可以使用sprintf()
$ perl -e ' my $hex = 0xFA1F; my $bin=sprintf("%b",$hex) ; print "$bin\n" ' 1111101000011111 $
如果您对使用发行版感到满意,我写道 位:: MANIP 在处理寄存器时使我的原型设计更容易一些(还有一个 纯Perl 如果您在编译XS代码时遇到问题,则可以使用该版本)。
它不仅可以从数字中取出位,还可以切换,清除,设置等:
use warnings; use strict; use Bit::Manip qw(:all); my $register = 0xFA1F; # fetch the bits from register using msb, lsb my $msbyte = bit_get($register, 15, 8); print "value: $msbyte\n"; print "bin: " . bit_bin($msbyte) . "\n"; # or simply: # printf "bin: %b\n", $msbyte;
输出:
value: 250 bin: 11111010
这是一个 博客文章 我写的那篇文章展示了如何使用一些软件的功能和示例数据表寄存器。