如何将 Kotlin ByteArray 转换为 NsData,反之亦然

Fra*_*cia 7 kotlin kotlin-native kotlin-multiplatform

与 Kotlin 多平台项目抗争 我已经结束了与 Kotlin Native一起工作时需要NsData在我的 iOS 平台上工作的问题sharedModule

因此,我需要将objectiveC 转换NsData为KotlinByteArray并返回。我怎样才能做到这一点?

Fra*_*cia 19

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

ByteArray 到 NsData

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

ByteArray 到 NsData 的不同方式

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

  • 对于任何查看此解决方案的人,请注意需要导入。我发布了 https://gist.github.com/noahsark769/61cfb7a8b7231e2069a9dab94cf74a62 ,其中包含我在这里使用的完整编译代码 (3认同)
  • 请注意,转换为“NSString”然后再转换为“NSString”的选项可能会给您带来错误的结果,因为这种转换会向输出添加额外的字节,这就是为什么最好仅使用“allocArrayOf”方法 (2认同)