如何将Kotlin的ByteArray转换为NsData以及反向转换

17

在使用 Kotlin Multiplatform 项目时,我遇到了一个问题:需要从 Kotlin Native 的 sharedModule 平台使用 NsData 来与 iOS 平台进行交互。

因此,我需要将 Objective-C 的 NsData 转换为 Kotlin 的 ByteArray,并且反过来也需要转换。如何实现这个功能呢?

1个回答

31

NsData 转 ByteArray

actual typealias ImageBytes = NSData
actual fun ImageBytes.toByteArray(): ByteArray = ByteArray(this@toByteArray.length.toInt()).apply {
    usePinned {
        memcpy(it.addressOf(0), this@toByteArray.bytes, this@toByteArray.length)
    }
}

ByteArray转换为NSData

actual fun ByteArray.toImageBytes(): ImageBytes? = memScoped {
    val string = NSString.create(string = this@toImageBytes.decodeToString())
    return string.dataUsingEncoding(NSUTF8StringEncoding)
}

将字节数组转换为NsData的另一种方式

actual fun ByteArray.toImageBytes() : ImageBytes = memScoped { 
    NSData.create(bytes = allocArrayOf(this@toImageBytes), 
        length = this@toImageBytes.size.toULong()) 
}

3
注意,使用将 NSString 转换为其他类型再转回来的选项可能会导致结果混乱,因为这种转换会向输出添加额外的字节,因此最好仅使用 allocArrayOf 方法。 - schmidt9
8
注意,任何查看此解决方案的人都需要导入相关库。我发布了 https://gist.github.com/noahsark769/61cfb7a8b7231e2069a9dab94cf74a62,其中包含我在此处使用的完整编译代码。 - Noah Gilmore
1
在我从KMM获取KotlinByteArray后,在Swift端如何将其转换为NSData / NSString? - stackich
@stackich 我也遇到了同样的问题 - 我找到的唯一方法是在 Kotlin 中定义一个 ByteArray 到 NSData 的方法,并从 Swift 中调用它。fun ByteArray.toNSData() = this.usePinned { NSData.create(it.addressOf(0), this.size.convert()) } - Nolan Amy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接