通过NSData将NSString编码为NSInputStream后,将更改字节

时间:2016-10-18 02:55:03

标签: ios objective-c nsinputstream

尝试将NSString编码为NSString时,我遇到了以下问题 - > NSData - > NSInputStream然后使用NSInputStream方法从read解码:

NSString *inputString = [NSString stringWithFormat:@"%c", 255];
NSData *data = [inputString dataUsingEncoding:NSUTF8StringEncoding];
NSInputStream *stream = [NSInputStream inputStreamWithData:data];
[stream open];
uint8_t bytes;
[stream read:&bytes maxLength:1];
NSLog(@"%i", bytes);

输出为195而非255。为什么呢?

1 个答案:

答案 0 :(得分:1)

由于您用于字符串的编码类型。 UTF-8是一种字符串编码形式,最终将大于127的字符转换为多字节序列。因此,虽然inputString包含单个字符,但您的数据对象实际上并不包含您可能假设的单个字节,而是多个(在本例中为两个)字节。当你从流中读取时,你只读取编码数据的第一个字节,但那里还有更多。

您无需通过输入流运行数据即可查看此结果。访问NSData实例的第一个字节会显示相同的内容。

你说这是一个“问题”,但你没有提出你想要实现的目标。 255不是可打印/有意义的文本字符。如果要传输原始数据字节,可以直接执行,而不是使用NSString和字符串编码。如果你正在传输字符串,那么它已经做了正确的事情。您只需要准备好您的数据大小可以超过字符串“长度”。