2013-07-12 21 views
1

我在增加表示IPv4地址的位串時遇到了問題。 字符串看起來是這樣的"E8 00 00 64" 我想要做的是這樣的:當將一個值aSourceAddress添加到這個字符串時,應該增加最後一位,即當加5時,字符串應該看起來像這樣"E8 00 00 69"。但是,當我加6時,我得到"E8 00 00 70",我希望得到的是"E8 00 00 6A"。 邏輯上它很簡單,我需要將aSourceAddress變量轉換爲十六進制,並將其添加到64,但我的輸出,再次,70. 所以我想我問的是,我怎麼能得到十六進制的結果。將十六進制值添加到位串

這是有點什麼,我到目前爲止。

proc dec2hex {dec_num} {return [format %04X $dec_num]} 
set lEndOfAddress {format 0x%x[expr { 0x64 + 0x[dec2hex $aSourceAddress] }]} 
set lCompareIpAddr "E8 00 00" 
append lCompareIpAddr " $lEndOfAddress" 

回答

1

首先,我認爲你應該接受,而不是將它添加在自己的優勢#標誌,它附加在必要時0x的。另外,我不知道我理解的填充(在4),但我會留給是:

proc dec2hex {dec_num} {return [format %0#4X $dec_num]} 

我覺得你的支架和/或間距在編輯搞砸了,但這裏的下一行固定:

set lEndOfAddress [format %02X [expr { 0x64 + [dec2hex $aSourceAddress] }]] 

,並簡化你的最後一行,

set lCompareIpAddr "E8 00 00 $lEndOfAddress" 

我得到的結果,

% set aSourceAddress 6 
5 
% proc dec2hex {dec_num} {return [format %0#4X $dec_num]} 
% set lEndOfAddress [format %02X [expr { 0x64 + [dec2hex $aSourceAddress] }]] 
6A 
% set lCompareIpAddr "E8 00 00 $lEndOfAddress" 
E8 00 00 6A 
+0

+1雖然我會期望一個'$ aSourceAddress = 6'的例子。最後一點,不妨使用'string toupper'將'6a'改爲'6A'。 – Jerry

+0

@Jerry - 好點。編輯和reran代碼只是爲了確保。謝謝。 –

+2

使用'%02X'(大寫字母)可以使'format'產生正確的輸出,而不需要額外的'string toupper'。 –

相關問題