通过 NSData 将 NSString 编码为 NSInputStream 后字节发生变化

Bytes are changed after encoding NSString into NSInputStream via NSData

我 运行 在尝试将 NSString 编码为 NSString -> NSData -> NSInputStream 然后从 [= 解码时出现以下问题14=] 用 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。为什么?

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

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

你说这是一个 "problem" 但你没有暗示你真正想要完成的事情。 255 不是 printable/meaningful 文本字符。如果你想传输原始数据字节,你可以直接这样做,而不是使用 NSString 和字符串编码。如果您正在传输字符串,那么它已经在做正确的事情。您只需要准备好您的数据大小可以超过您的字符串 "length".