剛剛開始學習objective-c,並試圖將字節數組轉換爲UTF8 NSString,但獲得nil/null。
這是縮寫代碼示例。將uint8_t轉換爲NSString
enum {
TMessageType_CALL = 1,
TMessageType_REPLY = 2,
TMessageType_EXCEPTION = 3,
TMessageType_ONEWAY = 4
};
int32_t VERSION_1 = 0x80010000;
int value = VERSION_1 | TMessageType_CALL;
uint8_t buff[4];
buff[0] = 0xFF & (value >> 24);
buff[1] = 0xFF & (value >> 16);
buff[2] = 0xFF & (value >> 8);
buff[3] = 0xFF & value;
//Convert buff to NSString with offset =0, length =4
我試過以下內容。
NSString *t = [[NSString alloc] initWithBytes:buff length:4 encoding:NSUTF8StringEncoding];
NSString *t1 = [NSString stringWithUTF8String:(char *)buff];
但兩者t
和t1
回報nil
。
什麼是正確的API轉換它正確? 此轉換需要在WriteI32()writeI64(),writeString(),writeDouble()之間是通用的。這裏是其餘的代碼。
- (void) writeI16: (short) value
{
uint8_t buff[2];
buff[0] = 0xff & (value >> 8);
buff[1] = 0xff & value;
[mTransport write: buff offset: 0 length: 2];
}
- (void) writeI64: (int64_t) value
{
uint8_t buff[8];
buff[0] = 0xFF & (value >> 56);
buff[1] = 0xFF & (value >> 48);
buff[2] = 0xFF & (value >> 40);
buff[3] = 0xFF & (value >> 32);
buff[4] = 0xFF & (value >> 24);
buff[5] = 0xFF & (value >> 16);
buff[6] = 0xFF & (value >> 8);
buff[7] = 0xFF & value;
[mTransport write: buff offset: 0 length: 8];
}
- (void) writeDouble: (double) value
{
// spit out IEEE 754 bits - FIXME - will this get us in trouble on
// PowerPC?
[self writeI64: *((int64_t *) &value)];
}
- (void) writeString: (NSString *) value
{
if (value != nil) {
const char * utf8Bytes = [value UTF8String];
size_t length = strlen(utf8Bytes);
[self writeI32: length];
[mTransport write: (uint8_t *) utf8Bytes offset: 0 length: length];
} else {
// instead of crashing when we get null, let's write out a zero
// length string
[self writeI32: 0];
}
}
'buf'中的4個字節不代表有效的UTF-8字符串。這就是爲什麼你得到'無'。你究竟想要什麼結果?顯示期望的字符串應該是什麼樣子。 – rmaddy
我明白了。我的目標是創建一個MD5出這個二進制數據,然後使用HTTP傳輸它。上面的代碼片段有用於編寫I32的版本,我還有其他的變體,例如writeString(),writeI64()等。我更新了上面的代碼。 – user2997127
您不能從原始字節'0x80','0x01','0x00','0x01'創建一個字符串,這是發佈代碼正在嘗試執行的操作。爲什麼你想創建一個字符串?堅持使用字節數據或'NSData'。 – rmaddy