【问题标题】:Convert a hex string in ASCII to the same hex values using Perl使用 Perl 将 ASCII 中的十六进制字符串转换为相同的十六进制值
【发布时间】:2015-02-22 05:03:52
【问题描述】:

我在 Perl 中有一个十六进制值作为 ASCII 字符串:

42dc3f74212c4e74bab2

我需要将其转换为十六进制,我的意思是 \x42\xdc\x3f 等。

$auth_key = pack("h*", $key); #它有点工作,但它给了我一个低半字节,所以我最终得到24 cd f3,等等。

如何将此字符串转换为相同值的十六进制!

如果有帮助,我正在尝试将其输入UDP 套接字。

【问题讨论】:

  • 顺便说一句:$key = "\x42\xdc\x3f\x74\x21\x2c\x4e\x74\xba\xb2";工作得很好......

标签: string perl hex ascii


【解决方案1】:

使用pack 'H*', $key

来自perldoc -fpack

h  A hex string (low nybble first).
H  A hex string (high nybble first).

以下是 shell 的一些输出:

$perl -E'print pack "H*","42dc3f74212c4e74bab2"' | hd
00000000  42 dc 3f 74 21 2c 4e 74  ba b2                    |B.?t!,Nt..|
0000000a

【讨论】:

  • 这就是它的样子 42dc 3f74 212c .j.......B.?t!, 0x0030: 4e74 bab2 Nt.. Thats with the $key manually set as in my comment above. with h* I get 24cd f347 12c2 .j.......$..G.. 0x0030: e447 ab2b .G.+ 和 H* 我得到了0400 14e5 ef37 5j...].........7 0x0030: 3f31 5b2b 9264 ?1[+.d
  • @GlenBizeau 其实是一样的。除非你正在处理插值。
  • 要么你没有pack "H*"(例如由于一个错误的shell命令),要么你同时改变了其他东西。
  • @GlenBizeau 如果你把它改回",它会停止工作吗?如果确实如此,我会感到惊讶。
  • @TLP 我把它改回来了,它可以双向工作。这很奇怪,我已经做 perl 大约 20 年了,喜欢它。这是我第一次玩 PACK 和 UNPACK,之前从未做过任何低级网络的事情。我本可以发誓它只是“我改变了,但把它改回来它仍然有效,所以我不知道了。盯着那个看了好几个小时想知道为什么它不起作用。我知道它应该,尤其是当 h* 给了我低半字节,所以 H* 应该以正确的方式做到这一点,但是唉......我们现在永远不会知道 :) 感谢你们两位的洞察力,有时更多的眼睛。
【解决方案2】:

另一种方式:

use strict;
use warnings;
use 5.016;

my $str = "42dc3f74212c4e74bab2";
$str =~ s/(..)/chr(hex($1))/eg;  #hex() -> convert hex string to decimal number, chr() -> convert decimal number to a character(string).
say $str;

say (pack "H*","42dc3f74212c4e74bab2");

--output:--
B??t!,Nt??
B??t!,Nt??

使用 hexdump 往返:

$ perl -E'print "42dc3f74212c4e74bab2" =~ s/(..)/chr(hex($1))/erg' | hexdump -C
00000000  42 dc 3f 74 21 2c 4e 74  ba b2                    |B.?t!,Nt..|
0000000a

pack()/unpack() 虽然效率很高,所以应该首选它们。

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 2017-03-11
    • 2014-11-16
    • 1970-01-01
    • 2019-07-27
    • 2012-02-03
    • 2018-01-31
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多