2011-09-13 62 views
4

iPhone上的許多/大部分OSStatus值都是4個字符的可顯示值,它們被卡入4字節的整數中。爲了使這些值能夠在小端系統的十六進制轉儲中顯示,這些字節在內存中的順序是相反的,這樣只需將它們複製到帶有memcpy的緩衝區並在末尾標記爲空就不會產生所需的內容結果。有沒有一種巧妙的方式來顯示iPhone OSStatus錯誤值?

有沒有人有一個聰明的方法來交換字節,並在相對少量的(源代碼)擊鍵中將它們轉換爲字符串?

回答

2

婉婷,以儘量減少代碼量(因爲這是需要保持簡單的診斷/調試代碼)我選擇了返回NSString的C函數:

NSString* statToString(UInt32 source) { 
    char buf[4]; 
    char* sourceView = (char*) &source; 
    buf[0] = sourceView[3]; 
    buf[1] = sourceView[2]; 
    buf[2] = sourceView[1]; 
    buf[3] = sourceView[0]; 
    return [[[NSString alloc] initWithBytes:buf length:4 encoding:NSUTF8StringEncoding] autorelease]; 
} 

這使得該函數可以直接在NSLog參數列表中使用,例如,無需聲明任何臨時數據。

可能可以通過使用其中一種拭子變體來加強它,但這種優化級別不是必需的。

2

查看CFByteOrder.h中的函數,例如CFSwapInt32(uint32_t)。

如果沒有,只寫你自己的32位字節交換代碼,例如:

#define SWAPUINT32(x) (((x & 0xff) << 24) | ((x & 0xff00) << 8) | \ 
         ((x & 0xff0000) >> 8) | ((x & 0xff000000) >> 24)) 

,因此使用它:

uint32_t swappedValue = SWAPUINT32(originalValue); 
相關問題