2013-11-15 80 views
1

剛剛開始學習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]; 

但兩者tt1回報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]; 
    } 
} 
+5

'buf'中的4個字節不代表有效的UTF-8字符串。這就是爲什麼你得到'無'。你究竟想要什麼結果?顯示期望的字符串應該是什麼樣子。 – rmaddy

+0

我明白了。我的目標是創建一個MD5出這個二進制數據,然後使用HTTP傳輸它。上面的代碼片段有用於編寫I32的版本,我還有其他的變體,例如writeString(),writeI64()等。我更新了上面的代碼。 – user2997127

+1

您不能從原始字節'0x80','0x01','0x00','0x01'創建一個字符串,這是發佈代碼正在嘗試執行的操作。爲什麼你想創建一個字符串?堅持使用字節數據或'NSData'。 – rmaddy

回答

3

buffunsigned char秒的數組,所以你可以這樣做:

NSString *t = [NSString stringWithFormat:@"%s", buff]; 

作爲替代方案,你可以得到明確每個字符:

NSMutableString *t = [NSMutableString stringWithCapacity:4]; 
for (NSUInteger i = 0; i < 4; ++i) 
    [t appendFormat:@"%c", buff[i]]; 
NSLog(@"%@", t); 

第一個選項呢轉換爲有效的字符串。第二個選項爲您提供每個字符,而不管任何終止字符('\ 0')。

我不確定這會給你什麼有用的信息,但是你有它。

+2

不,這些都不是很好的解決方案。該緩衝區中有一個「0」值,這樣就會弄亂字符串。加上第一個字節是'0x80',它不是一個有效的字符。 – rmaddy

+0

我是@「\ x02 \ x06 \ x01 \ x01 \ xe4 \ x84 \ x03」我不知道爲什麼它會在每個角色前加\ x。 – Xeieshan