Perl:创建二进制数并将其转换为十六进制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl:创建二进制数并将其转换为十六进制相关的知识,希望对你有一定的参考价值。

我想从给定的用户输入创建二进制数。

输入 - 数字数组

输出 - 二进制数

应该创建一个二进制数,使其在所有已作为输入给出的位置上有一个。

在给定的情况下,输入是1,3和7,所以我的二进制no应该是1000101,所以它在左边的1,3和7位有1。

@x = [ 1, 3, 7 ];
$z = 0;
for( $i = 0; $i < 10; $i++ ){
    foreach $elem ( @x ){
        if( $elem == $i ){
            join( "", $z, 1 );
        }
        else{
            join( "", $z, 0 );
       }
   }
}
print "Value of z: $z";

执行后,我将z的值设为0。

我需要将此二进制文件转换为十六进制。

是否有一些函数将二进制转换为十六进制?

答案

[ ]创建一个数组并返回对该数组的引用,因此您将一个标量分配给(名称不佳)@x

你也在滥用join。总是使用use strict; use warnings qw( all );!它会抓住这个错误。

固定:

my @bits = ( 1, 3, 7 );

my $num = 0;
$num |= 1 << $_ for @bits;
                                           #   76543210
printf("0b%b
", $num);                    # 0b10001010
printf("0x%X
", $num);                    # 0x8A

看来你想要0b1000101,所以我们需要纠正索引。

my @bits_plus_1 = ( 1, 3, 7 );

my $num = 0;
$num |= 1 << ( $_ - 1 ) for @bits_plus_1;
                                           #   6543210
printf("0b%b
", $num);                    # 0b1000101
printf("0x%X
", $num);                    # 0x45
另一答案

一些问题:

  • @x = [ 1, 3, 7 ];不是三个整数的数组。它是一个包含单个数组引用的数组。你想要的是圆括号,而不是方括号:@x = ( 1, 3, 7 );
  • join返回的字符串未分配给$z

但即便如此,你的代码仍然是错误的:

  • 它在$z的末尾附加了一点,而不是开头
  • 有一个尾随零,没有业务存在。

以上是关于Perl:创建二进制数并将其转换为十六进制的主要内容,如果未能解决你的问题,请参考以下文章

读取二进制数据并将其转换为十六进制

是否可以将 16 位二进制数转换为两个字符并将其保存到文本文件中?

如何将 int 转换为十六进制数并将其打印为 c 中的 3 位数字? [复制]

如何在Perl中将十六进制转换为字符串

Perl 打包/解包/移位

Perl程序将二进制转换为ascii