【问题标题】:Convert stream bytes to string将流字节转换为字符串
【发布时间】:2013-08-10 14:47:45
【问题描述】:

我正在使用 google 协议缓冲区将一些数据从 C++ 服务器发送到 IOS 应用程序。我在IOS端使用这个函数将流字节转换为字符串:

-(NSString*)convertStreamBytesToString:(NSMutableData*)data
{
    int len = [data length];
    char raw[len];

    [data getBytes:raw length:len];
    NSString *protocStruct =[[NSString alloc] initWithBytes:raw length:len encoding:NSUTF8StringEncoding];

    return protocStruct;

}

我的问题是有时这不起作用。我可以看到我发送和接收了所有字节,但是在转换时其中一些字节丢失了。例如,我得到 83 个字节,但在打印字符串时,我得到大约 20 个字符。其余的在哪里?这个转换方法有我不知道的问题吗?

【问题讨论】:

  • 你试过NSASCIIStringEncoding而不是NSUTF8StringEncoding吗?
  • @CaptJak:是的,结果相同
  • 它们都是可打印的字符吗?
  • 您应该使用 base64 编码/解码来执行此操作。纯二进制数据可能并不总是有效的 UTF-8!
  • @MarcusAdams: 是的,我从服务器得到的是一个从 xml 文件中检索数据的结构

标签: ios objective-c


【解决方案1】:

NSString 是一个处理 Unicode 字符串的类。您不能像使用 C 字符串那样在其中存储任意字节。 (即使那样,您也可能无法传输二进制数据来代替字符串并期望它能够在传输过程中幸存下来)

您需要将二进制数据转换为字符串,以生成有效的文本字符串。例如通过 Base64 编码。

有很多 iOS 项目可以对 Base64 进行编码/解码,只需 google 一下。

这是一篇关于它的文章:http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html?m=1

【讨论】:

    【解决方案2】:

    在 obj-c 中在堆栈上分配 C 数组有时会导致错误。 尝试为 char 数组使用动态内存:

    char* raw = (char*)malloc(len*sizeof(char));
    

    然后释放它:

    free(raw);
    

    【讨论】:

    • 仍然遇到同样的问题
    • 这不是问题。问题是您不能将原始字节转换为 NSString——它必须是具有有效文本编码的数据。
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多