通过 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".
我 运行 在尝试将 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".