如何在Perl中反转8字节字符串的字节顺序?

如何在Perl中反转8字节字符串的字节顺序?,perl,Perl,如何在Perl中将FF02500000020更改为200000000005002FF 我能做的就是: 将FF02500000020分为两部分FF025000和00000020 在它们前面加上0x 然后 my $num2=0xFF025000; my $num3=0x00000020; my $s2=pack('I!',$num2); my $s3=pack('I!',$num3); print unpack ("H*", "$s2") . "\n"; print unpack

如何在Perl中将FF02500000020更改为200000000005002FF

我能做的就是:

  • 将FF02500000020分为两部分FF025000和00000020
  • 在它们前面加上0x
  • 然后

    my $num2=0xFF025000;  
    my $num3=0x00000020;  
    my $s2=pack('I!',$num2);  
    my $s3=pack('I!',$num3);  
    print unpack ("H*", "$s2") . "\n";  
    print unpack ("H*", "$s3") . "\n";
    
  • 然后再把这两部分结合起来


  • 有什么简单的方法吗?

    试试Convert::Binary::C。看起来它可以做你想做的事。

    试试Convert::Binary::C。看起来它可以做你想做的事。

    将数据放入一个(单个)变量中-称它为
    $data
    。然后使用(标量)

    或:

    将数据放入一个(单个)变量中-将其称为
    $data
    。然后使用(标量)

    或:

    或者,如果您希望它是一个标量:

    $val = join '', reverse split /(..)/, 'FF02500000000020';
    
    或者,如果您希望它是一个标量:

    $val = join '', reverse split /(..)/, 'FF02500000000020';
    
    这里有一个方法:

    $str = unpack 'H*', reverse pack 'H*', $str;
    
    注意,这将使十六进制字符小写,因此如果保留大小写很重要,您可能希望在开头添加
    uc()

    $str = uc unpack 'H*', reverse pack 'H*', $str;
    
    这里有一个方法:

    $str = unpack 'H*', reverse pack 'H*', $str;
    
    注意,这将使十六进制字符小写,因此如果保留大小写很重要,您可能希望在开头添加
    uc()

    $str = uc unpack 'H*', reverse pack 'H*', $str;
    


    您从什么输入数据开始?一串原始字节?十六进制格式的字符串?这是另一件我感到困惑的事情。它是我使用@array=split(/\\x/,$data)从另一个字符串\xff\x02\x50\x00\x00\x00\x00\x20获得的变量;使用spice和join得到这个变量。我可以把函数hex应用到这个变量上。我猜是字符串。你从什么输入数据开始?一串原始字节?十六进制格式的字符串?这是另一件我感到困惑的事情。它是我使用@array=split(/\\x/,$data)从另一个字符串\xff\x02\x50\x00\x00\x00\x00\x20获得的变量;使用spice和join得到这个变量。我可以把函数hex应用到这个变量上。我猜它是string.not corret,它将恢复为020000000000520ff,我想200000000005002ffit取决于您要处理的数据类型。它反转字节;如果使用包含十六进制的字符串,则不会得到结果。如果你有二进制数据,它就会工作。如果事实上您有一个字符串,并且想要反转字节对,那么您可以将该字符串拆分为一个字节对列表,反转列表的顺序,然后重新组合,就像在其他答案中一样。但不精确的问题会产生不精确的答案。如果你展示了一个例子,'给定
    my$data=qq{…}
    ,如何获得结果
    my$res=qq{…}?,那么每个人都会知道你想要什么。ic,所以我发布的答案是误导性的。事实上,输入是一个字符串$hex_pers_flags_endian=“FF02500000020”,而不是一个十六进制数-0xFF025000…,因此它们是不同的。感谢您没有更正,它将恢复为020000000000520ff,我希望200000000005002ffit取决于您要处理的数据类型。它反转字节;如果使用包含十六进制的字符串,则不会得到结果。如果你有二进制数据,它就会工作。如果事实上您有一个字符串,并且想要反转字节对,那么您可以将该字符串拆分为一个字节对列表,反转列表的顺序,然后重新组合,就像在其他答案中一样。但不精确的问题会产生不精确的答案。如果你展示了一个例子,'给定
    my$data=qq{…}
    ,如何获得结果
    my$res=qq{…}?,那么每个人都会知道你想要什么。ic,所以我发布的答案是误导性的。事实上,输入是一个字符串$hex_pers_flags_endian=“FF02500000020”,而不是一个十六进制数-0xFF025000…,因此它们是不同的。谢谢,这两者之间有什么区别:我的$hex_pers_flags_endian=“ff02500000020”;my$hex_pers_flags=反向拆分/(..)/,$hex_pers_flags_endian;打印“十六进制标志=$hex\u pers\u标志\n”;打印反向拆分/(..)/,$hex_pers_flags_endian;如果直接反向打印正确答案,如果将结果存储在$hex_pers_标志中,然后打印,则显示020000000000520FFI知道原因。应该是:我的$hex\u pers\u flags\u endian=“FF02500000020”;my@hex_pers_flags=反向拆分/(..)/,$hex_pers_flags_endian;我的$hex_pers_flags=加入“”,@hex_pers_flags;所以:
    my$res=join'',反向拆分/(..)/,$data.Hi,这两者之间有什么区别:我的$hex\u pers\u flags\u endian=“FF02500000020”;my$hex_pers_flags=反向拆分/(..)/,$hex_pers_flags_endian;打印“十六进制标志=$hex\u pers\u标志\n”;打印反向拆分/(..)/,$hex_pers_flags_endian;如果直接反向打印正确答案,如果将结果存储在$hex_pers_标志中,然后打印,则显示020000000000520FFI知道原因。应该是:我的$hex\u pers\u flags\u endian=“FF02500000020”;my@hex_pers_flags=反向拆分/(..)/,$hex_pers_flags_endian;我的$hex_pers_flags=加入“”,@hex_pers_flags;所以:
    my$res=join'',反向拆分/(..)/,$data。我不认为这正是该人员想要的,但知道它的存在很好。假设这就是OP问他们特定问题的原因,它可能是以特定字节顺序存储内容的更好解决方案。我不认为这正是该人员想要的,但是很高兴知道它的存在,如果OP问他们的问题的原因是这样的,那么它可能是一个更好的以特定字节顺序存储东西的解决方案。