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

Kir*_*ill 1 perl

我读了这篇文章: 如何在perl中将十六进制转换为char字符串 以将十六进制转换为图表字符串。

如何进行反向操作?我需要在perl中将char字符串转换为十六进制。例如,我有字符串“ hello world! ”,我必须得到:

00680065006C006C006F00200077006F0072006C00640021
Run Code Online (Sandbox Code Playgroud)

sim*_*que 6

您可以用来执行此操作的一种算法是:

一个可能的实现可能是

print map { sprintf '%04X', ord } split //, 'hello world!';
Run Code Online (Sandbox Code Playgroud)

这个程序的输出是

00680065006C006C006F00200077006F0072006C00640021
Run Code Online (Sandbox Code Playgroud)

也就是说,可能有一个pack我不知道的实现。


ike*_*ami 6

现有答案提供了 Unicode 代码点的十六进制表示。

该格式不允许输入包含 0xFFFF 以上的任何字符。如果它允许这样做,将无法知道是否

20000200002000020000
Run Code Online (Sandbox Code Playgroud)

方法

2000 0200 0020 0002 0000
Run Code Online (Sandbox Code Playgroud)

或者

20000 20000 20000 20000
Run Code Online (Sandbox Code Playgroud)

如果这很好,因为你永远不会有超过 0xFFFF 的字符,那么我推荐以下内容:

my $text = 'hello world!';
my $hex = uc unpack 'H*', pack 'n*', unpack 'W*', $text;
Run Code Online (Sandbox Code Playgroud)

它应该比现有解决方案快得多,并且它比现有解决方案更好地处理 0xFFFF 以上的字符(因为它仍然只为 0xFFFF 以上的字符提供 4 个十六进制数字)。


但是,如果您想处理所有 Unicode 代码点,则上述解决方案和早期答案提供的解决方案是不够的。

考虑到这一点,我怀疑您实际上想要 Unicode 代码点的 UTF-16be 编码的十六进制表示。更糟糕的是,字符大于 0xFFFF 仍会产生有用且无损的输出。

20000200002000020000
Run Code Online (Sandbox Code Playgroud)

如果是这样的话,你想要

use Encode qw( encode );

my $text = 'hello world!';
my $hex = uc unpack 'H*', encode 'UTF-16be', $text;
Run Code Online (Sandbox Code Playgroud)


Dav*_*oss 5

这是另一种方法。使用正则表达式一次完成所有操作。

my $string = 'hello world!';
$string =~ s/(.)/sprintf '%04x', ord $1/seg;
Run Code Online (Sandbox Code Playgroud)

  • @FlorianB,1) 由于 `/s`,`.` 已经匹配换行符 2) 为什么您要不必要地限制自己只能使用前 256 个 Unicode 字符?! (2认同)