2013-05-07 81 views
2

解決此問題。謝謝你這麼多傢伙^^Perl:如何將big endian轉換爲little endian

我的問題,我使用下面陳述的解決方案。

原來的問題:---主編2013年5月8日

我知道我可以用C做這個任務++這樣的:

struct {    /* File Header */ 
    int a; 
    int b; 
    short c;  
    short d; 
} PPPhdr; 
PPPhdr head; 
fstream fst; 
fst.open("file.txt", ios_base::in|ios_base::binary); 
fst.read((char*)&head, sizeof(PPPhdr)); 
SwapInt32(&(head.a)); 
SwapInt32(&(head.b)); 
SwapShort(&(head.c)); 
SwapShort(&(head.d)); 

所以,基本上SwapInt32會做到這一點:

0x89346512 -> 0x12653489 

SwapShort會做到這一點:

0x3487 -> 0x8734 

現在我的問題是,我該如何在Perl中執行此操作?

我的方式:

open FH, "<file.txt" or die print "Cannot open file\n"; 
binmode FH; 
read FH, $temp, 12; 
($a,$b) = unpack("N2", substr($temp,0,8)); 
($c,$d) = unpack("n2", substr($temp,8,4)); 
close(FH); 
print "$a\n$b\n$c\n$d\n"; 
+1

你能告訴什麼輸入和預期輸出是十六進制什麼? – choroba 2013-05-07 15:20:23

+0

0x89346512 - > 0x12653489 ---這就是我想要做的 – sflee 2013-05-08 00:09:52

回答

2

你說你的數據是大端,但您使用的是解包呼叫i模板(一個符號的整數值)。你應該使用N(一個無符號的32位big-endian數字)。您可能想要閱讀documentation

+0

謝謝我已經試過這樣: '$ TEMP =解壓( 「N」,$ TEMP);'' 打印$溫度;' 這個結果相同: '$ TEMP =解壓( 「I>」,$ TEMP);'' 打印$溫度;' 這是不是我想要的。 – sflee 2013-05-07 23:58:01

+0

是的,你是對的,我解決了我的問題,非常感謝。 – sflee 2013-05-08 05:07:11

+0

一個跟進問題。如何轉換一個有符號的32位big-endian數字? – sflee 2013-05-08 05:19:22

2

Perl對於有符號的big-endian整數沒有單字符格式。爲此,請使用pack 'i>'。 (這至少需要Perl的5.10。)

+0

謝謝,我已經試過這樣:
'$溫度=解壓( 「I>」,$ TEMP);'
'$打印溫度;'
但得到的答覆是不是我想要的。
接下來我應該做什麼? – sflee 2013-05-07 23:50:19

+0

是的,你是對的,我解決了我的問題,非常感謝。 – sflee 2013-05-08 05:07:30

1

你收拾它,並解壓反過來:

print "ok\n" if 0x12653489 == unpack 'L', pack 'N', 0x89346512; 
+0

非常感謝。 – sflee 2013-05-08 05:08:11