【问题标题】:How to convert Objective-C NSData to Swift Data?如何将 Objective-C NSData 转换为 Swift 数据?
【发布时间】:2022-01-10 11:37:32
【问题描述】:

我在 Objective-C 中有一个 NSData,NSData 的值为 0x10,代码如下:

@implementation BufUtil
+ (NSData *_Nonnull) getOCBuf {
    std::vector<uint8_t> sendData = {0x10};
    NSData * reqBuf = [[NSData alloc] initWithBytesNoCopy:sendData.data() length:sendData.size() freeWhenDone:false];
    NSLog(@"getOCBuf, oc NSData reqBuf:%@", reqBuf);
    return reqBuf;
}
@end

然后我在Swift中使用数据,Swift自动将Objective-C NSData转换为Swift Data,但是奇怪的事情发生了,Swift Data中的值是0x60,代码如下:

public func getOCBuf() -> Data {
    let data = BufUtil.getOCBuf();
    print("getOCBuf: swift data: \(data.hexEncodedString())")
    return data
}

日志是这样的:

getOCBuf, oc NSData reqBuf:{length = 1, bytes = 0x10}
getOCBuf: swift data: 60

现在我对发生的事情感到困惑。为什么0x10变成0x60,这两个数不是二进制补码。

谁能帮帮我,谢谢。

代码:
https://github.com/oncealong/SwiftOcDataConvert

【问题讨论】:

  • std::vector 似乎比 Objective-C 更 C++。这可能是问题所在。您可以在此post 中找到有用的信息

标签: ios swift objective-c nsdata language-interoperability


【解决方案1】:

这是我的错。

我从 stackoverflow 复制代码“如何从 std::vector 转换为 NSData”,但代码使用了[NSData alloc] initWithBytesNoCopy,这导致了这一切。

在 getOCBuf 函数返回后,与 std::vector 关联的内存已释放。但 oc NSData 和 swift Data 不知道。它使用原始地址并找到不同的值。

老实说,应用应该崩溃,并给出原因。

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多