2011-02-23 62 views
1

我知道這似乎是一個愚蠢的問題,但我真的在這裏遇到麻煩。麻煩轉換十二進制到十六進制(詮釋爲字符)

我正在一個項目中,我有一些我不能修改的功能。也就是說,我在Obj裏面有一些C函數(不是我的專長)。我可以修改的C代碼。

所以這裏是...解釋一下我有什麼。

我收到一個NSData,如「\xce\x2d\x1e\x08\x08\xff\x7f」。我必須把每個\十六進制代碼在字符數組,像這樣:

cArray[1]=ce; 
    cArray[2]=2d; 
    cArray[3]=1e; 
    cArray[4]=08; 

等等,等等......當然不是這樣,但只是讓你明白。我最初的舉動是將NSData與subdataWithRange分開:並用所有「subdata」填充一個數組。所以下一步可能是將該數組的每個位置傳遞給一個char數組,這就是我卡住的地方。

我使用類似(不要有我的代碼現在)

for(int i=0 ; i<=64 ; i++) { 
[[arrayOfSubData objectAtIndex:i] getBytes:&charArray[i]]; 
} 

,以填補從我的子數據陣列的十六進制的字符數組。這工作幾乎完美。幾乎。

以CARRAY的那個例子,我NSLog(@"pos%i: %x",i,charArray[i])會告訴我:

pos1: ce 
pos2: 2d 
pos3: 1e 
pos4: 8 

和所有的「左零」,因爲同樣的方式supressed。我現在的解決方法(我不確定這是否是最佳做法)是採用我的subDataArray和initWithFormat:一個字符串。與此我可以將字符串轉換爲一個int與NSScanner scanHexInt:,但然後我再次將我的小數點轉換爲十六進制CHAR時再次被卡住。以這種方式填充我的char數組的最佳方法是什麼?

任何幫助或一些「強硬的愛」將不勝感激。由於

回答

2

printf formatting正常的規則,你希望(其中的NSLog以下也)以下:

NSLog(@"pos%i: %02x", i, charArray[i]); 

在「0」到左墊說,與0和是一個標誌。 '2'表示確保該字段的輸出至少有兩個字符。這樣可以確保至少輸出兩個字符,並用'0'填充到左側以填充空間。

+0

哦,我明白了。謝謝! 但你是否說 - 除了我的NSLog格式化錯誤 - 所有的字節被整體傳遞給我的charArray與該函數「getBytes」?這真的只是在我的NSLog的錯誤,我不需要改變別的? – Fred 2011-02-24 00:38:20

+0

有點奇怪,你似乎從位置1開始索引你的C數組,而不是0,你似乎有點偏離你的方式,但是。因爲printf(和NSLog)的默認行爲是儘可能少地輸出數字,所以0被切斷。爲了節省跳躍的次數,你還應該檢查你是否可以使用原始的NSData作爲你想要的數組,例如NSLog(@「pos%i:%02x」,i,[data bytes] [i]);所以直接使用由NSData的'bytes'屬性返回的C數組。 – Tommy 2011-02-24 01:47:08

+0

有道理..正如我所說的,我現在沒有使用我的代碼,所以在這裏提出我的問題時,索引的問題可能只是缺乏關注。但是我明天也要檢查。謝謝你的幫助! – Fred 2011-02-24 02:12:29