【问题标题】:Data corrupt after converting byte[] to NSData将 byte[] 转换为 NSData 后数据损坏
【发布时间】:2013-03-20 23:02:57
【问题描述】:

我有 .Net Web 服务响应,其中包含一个 byte[] 条目以及其他字段。 数据为 PDF 文件。

我从收到的数据中提取字典: [NSJSONSerialization JSONObjectWithData]

此后我使用以下代码将 byte[] 转换为 NSData。 然后我将结果保存到磁盘(见最后一行)。

打开生成的 PDF 文件时,出现以下错误:

“未能找到 PDF 标题:找不到‘%PDF’。”

        NSArray *byteArray = [rootDictionary objectForKey:@"file"];

        unsigned c = byteArray.count;
        uint8_t *bytes = malloc(sizeof(*bytes) * c);

        unsigned i;
        for (i = 0; i < c; i++)
        {
            NSString *str = [byteArray objectAtIndex:i];
            int byte = [str intValue];
            bytes[i] = (uint8_t)byte;
        }

        NSData* data = [NSData dataWithBytes:(const void *)byteArray length:sizeof(unsigned char)*c];

        //Save to disk using svc class.
        NSString *localPath = [svc saveReport:data ToFile:[rootDictionary objectForKey:@"name"]];

我还尝试将 byte[] 转换为 base64 NSString(在服务端),然后在我的应用程序中转换回 NSData,这可以正常工作(**大部分情况下),但我被告知这是草率的代码。

** 当同时异步拉取多个 PDF 时,其中一些作为 base64 字符串接收的报告也已损坏。

PS。如果我也必须提供我的 svc 类中的代码,请告诉我,但我认为问题不存在。

编辑: 我创建了一个以 byte[] 作为输入的新 Web 服务方法,然后修改了我的 iOS 应用程序以将 byteArray 变量发送回服务,并将其保存到文件中。 生成的 PDF 文件是 Adob​​e 可读的有效文件。意味着在传输过程中没有损坏。

谢谢!

【问题讨论】:

  • 附带说明,我确认服务器端的文件与生成的 NSData 大小完全相同。此外,服务器上的文件是在 Adob​​e 中成功打开的有效 PDF。

标签: ios json pdf bytearray nsdata


【解决方案1】:

好的,在仔细梳理了我的代码后终于解决了这个问题(受来自http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=38590#p38590 的 snadeep.gvn 的启发)。

我犯了一个愚蠢的错误,我忽略了 100 多次。

这行代码:

NSData* data = [NSData dataWithBytes:(const void *)byteArray length:sizeof(unsigned char)*c];

应该改为:

NSData* data = [NSData dataWithBytes:(const void *)bytes length:sizeof(unsigned char)*c];

美好的时光,现在我终于可以睡一觉了:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多