将字符串的前8个字符表示为用空格分隔的十六进制数字



我需要将字符串的前8个字符表示为用空格分隔的十六进制数字。

例如:"这是测试!">转换为"54 68 69 73 20 69 73 20">

我用下面的代码来做这件事。在Perl中有更好(更简单(的方法吗?

my $hex = unpack( "H16", $string );
my $hexOut = "";
for ( my $i = 0 ; $i < length($hex) ; $i += 2 )
{
    $hexOut .= substr( $hex, $i, 2 ) . " ";
}
$hexOut = substr( $hexOut, 0, -1 );

我忍不住提交了一个Perl单行!

my $string = "This is a test";
print(join(' ', unpack("(A2)*", unpack( "H16", $string ))) . "n");

如果对null进行拆分,则会得到一个字节列表。然后用十六进制打印。

use strict;
use warnings;
my $string = shift // 'This is the test!';
my @bytes = split //, $string;
for my $i (0..7) {
    printf "%02X ", ord $bytes[$i];
}
print "n";

但是,如果您真的想要字符而不是字节,那么请解压缩。

my @chars = unpack "C0U*", $string;
for my $i (0..7) {
    printf "%02X ", $chars[$i];
}
print "n";

对于测试字符串,它是相同的

$ ./leon01.pl
54 68 69 73 20 69 73 20 
54 68 69 73 20 69 73 20 

但总的来说,它不是

$ ./leon01.pl 'A Møøse once bit my sister.'
41 20 4D C3 B8 C3 B8 73 
41 20 4D F8 F8 73 65 20 
$ ./leon01.pl '① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩'
E2 91 A0 20 E2 91 A1 20 
2460 20 2461 20 2462 20 2463 20 
my $string = "This is the test!";
my $hex_string = sprintf("%vx", substr($string, 0, 8));
$hex_string =~ y/./ /;
print $hex_string, "n";

(v修饰符是printf格式的perl特定扩展,在5.8.x IIRC中引入。(

我会让您决定这是否更好。只是另一种方法

#! /usr/bin/perl -w
$string    = "This is the test!";
$strLength = length($string);
@bytes = unpack(A2 x $strLength,unpack("H16",$string));
print "@bytesn";
# Also could change it back to a string w/spaces:
$pretty = join(" ",@bytes);
print $pretty;

相关内容

最新更新