我有两个相关的问题(在Perl中):
>将数据写入二进制文件,格式为:单位标志后跟8位
>回读相同的格式
我试过这个(和其他变化,但对于我的生活,我无法弄清楚这一点):
binmode(OUT); my $bit = pack("B1",'1'); my $byte = pack("H2","02"); print OUT $bit . $byte;
使用十六进制编辑器,我看到我得到16位:
1000000000000020
我想要的是9位:
100000020
另外:假设我写出了其中两种模式.这意味着我最终得到9 9 = 18位.我不知道如何处理最后一个字节(填充?)
解决方法
你可以使用Bit :: Vector来更轻松地管理你的位和转换,
use Bit::Vector; my $bit = Bit::Vector->new_Bin( 1,'1' ); my $byte = Bit::Vector->new_Bin( 8,'00000010' ); my $byte_9 = Bit::Vector->new_Bin( 9,'000000010' ); my $nineBits = Bit::Vector->new_Bin( 9,'100000000' ); my $carry = Bit::Vector->new_Bin( 9,'000000000' ); my $ORed = Bit::Vector->new_Bin( 9,'000000000' ); my $added = Bit::Vector->new_Bin( 9,'000000000' ); $ORed->Union($nineBits,$byte_9); print "bit: 0x". $bit->to_Hex(). "\n"; print "byte 2: 0x". $byte->to_Hex(). "\n"; print "nineBits: 0x". $nineBits->to_Hex(). "\n"; print "nineBits: 0x". $nineBits->to_Bin(). "\n"; print "ORed bit and byte 0x". $ORed->to_Dec(). "\n"; open BINOUT,">out.bin" or die "\nCan't open out.bin for writing: $!\n"; binmode BINOUT; print BINOUT pack ('B*',$ORed->to_Bin()) ."\n"
这是输出
>perl bitstuff.pl bit: 0x1 byte 2: 0x02 nineBits: 0x100 nineBits: 0x100000000 ORed bit and byte 0x-254 >cat out.bin \201^@