2013-11-15 81 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