iPhone上的許多/大部分OSStatus值都是4個字符的可顯示值,它們被卡入4字節的整數中。爲了使這些值能夠在小端系統的十六進制轉儲中顯示,這些字節在內存中的順序是相反的,這樣只需將它們複製到帶有memcpy的緩衝區並在末尾標記爲空就不會產生所需的內容結果。有沒有一種巧妙的方式來顯示iPhone OSStatus錯誤值?
有沒有人有一個聰明的方法來交換字節,並在相對少量的(源代碼)擊鍵中將它們轉換爲字符串?
iPhone上的許多/大部分OSStatus值都是4個字符的可顯示值,它們被卡入4字節的整數中。爲了使這些值能夠在小端系統的十六進制轉儲中顯示,這些字節在內存中的順序是相反的,這樣只需將它們複製到帶有memcpy的緩衝區並在末尾標記爲空就不會產生所需的內容結果。有沒有一種巧妙的方式來顯示iPhone OSStatus錯誤值?
有沒有人有一個聰明的方法來交換字節,並在相對少量的(源代碼)擊鍵中將它們轉換爲字符串?
婉婷,以儘量減少代碼量(因爲這是需要保持簡單的診斷/調試代碼)我選擇了返回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參數列表中使用,例如,無需聲明任何臨時數據。
可能可以通過使用其中一種拭子變體來加強它,但這種優化級別不是必需的。
查看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);