2013-05-07 38 views
-1

我有以下一段代碼,它將1個字符一次轉換爲一個十六進制。我想將兩個字符轉換爲十六進制。即99ab應該被視爲'99','ab'被轉換爲相應的十六進制。一次將兩個字符從一個字符串轉換爲十六進制

當前實現如下

$final =~ s/(.)/sprintf("0x%X ",ord($1))/eg; 
chop($final); 

TIA

+0

你的問題不明確。如果以'$ final =「99ab」開頭,'$ final'應該包含什麼內容?''? – ikegami 2013-05-07 02:21:54

+0

@ikegami:我認爲他想在兩個字節段對待他們 – 2013-05-07 02:25:50

+0

是不是99ab已經十六進制? – xaxxon 2013-05-07 02:37:18

回答

2

你的問題並沒有多大意義。十六進制是號碼的字符串表示形式。您不能將字符串轉換爲十六進制。

您可以將字符串個字符轉換爲十六進制,因爲字符只是數字,但這顯然不是您想要的。 (這是你的代碼做什麼。)


我認爲你正試圖從十六進制轉換爲字符。

6 chars "6a6b0a" ⇒ 3 chars "\x6a\x6b\x0a" 

如果是的話,你可以用你的

$final =~ s/(..)/ chr(hex($1)) /seg; 

$final = pack 'H*', $final; 

我能想到的另一種可能的選擇是,要解壓縮16位整數。

6 chars "6a6b" ⇒ 13 chars "0x6136 0x6236" (LE byte order) 
    -or- 
6 chars "6a6b" ⇒ 13 chars "0x3661 0x3662" (BE byte order) 

如果是這樣,你可以使用

my @nums = unpack 'S<*', $packed; # For 16-bit ints, LE byte order 
    -or- 
my @nums = unpack 'S>*', $packed; # For 16-bit ints, BE byte order 

my $final = join ' ', map sprintf('0x%04X', $_), @nums; 
相關問題