【问题标题】:How do convert a block unsigned char* memory to a block of [signed] char* memory?如何将块 unsigned char* 内存转换为 [signed] char* 内存块?
【发布时间】:2012-04-11 00:37:42
【问题描述】:

我正在开发一个 iPad 项目 (iOS 5.1),它需要从 url 获取图像并将它们缓存为 sqlite3 blob。我正在使用 ASIHTTPRequest 来获取图像数据,并使用 SOCI 将 blob 插入到缓存表中。该项目是用 C++ 编写的(与最小的 Objective-C 混合)。

问题是 ASIHTTPRequest 通过一个 NSData 对象返回二进制数据......我可以从中获取一个 const unsigned char* 指针。但是 SOCI 的接口只提供了一个通过 char* 指针读取/写入 blob 数据的接口……(SOCI 在打开/写入/读取 sqlite_blob 之前内部将数据写入 char* 缓冲区)。

那么,那么问题是将我的 unsigned char* 缓冲区转换为 char* 缓冲区是否可行? ..如果是这样,我该怎么做? ..否则,我还有什么其他选择可以解决这个问题?

【问题讨论】:

    标签: c++ objective-c buffer asihttprequest soci


    【解决方案1】:

    要详细说明@Binyamin 所说的内容,请务必使用 memcpy,但这样您就可以知道您的缓冲区不会消失:

    uint8_t *origBuffer = [data bytes];
    char *myBuffer = malloc([data length]);
    
    memcpy(myBuffer, origBuffer, [data length]);
    
    // don't forget to free 'myBuffer' when done!
    

    【讨论】:

    • 缓冲区不应消失或失效,除非 a) 你释放 data 或弹出它所属的自动释放池 b) 你改变可变的 data
    • @Joe 完全正确。在内存管理方面,安全总比后悔好。
    • @RichardJ.RossIII 我同意,但是在内存有限的设备上工作时,如果你能保证NSData 不会改变,那么你会没事的。否则我同意,安全总比后悔好。
    【解决方案2】:

    一个简单的铸造就可以完成这项工作:

    (unsigned char *)myCharPointer
    (char *)myUnsignedCharPointer
    

    【讨论】:

    • 您需要转换为const char *
    • 我使用了 reinterpret_cast ...但是,是的,同样的区别。谢谢。
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多