【问题标题】:Bytes are changed after encoding NSString into NSInputStream via NSData通过 NSData 将 NSString 编码为 NSInputStream 后字节被更改
【发布时间】:2016-10-18 02:55:03
【问题描述】:

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

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。为什么?

【问题讨论】:

    标签: ios objective-c nsinputstream


    【解决方案1】:

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

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

    您说这是一个“问题”,但您并没有建议您要实际完成的工作。 255 不是可打印/有意义的文本字符。如果要传输原始数据字节,可以直接执行此操作,而不是使用 NSString 和字符串编码。如果您正在传输字符串,那么它已经在做正确的事情了。您只需要准备好您的数据大小可能会超过您的字符串“长度”。

    【讨论】:

    • TIL,感谢您的解释!这是我的单元测试的一部分,我期待像 XCTAssertEqual((int)bytes, 255); 这样的东西。
    • 没问题。听起来这可能只是一个无用的测试。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多