Skip to content

Instantly share code, notes, and snippets.

@yandroidUA
Last active January 25, 2024 14:59
Show Gist options
  • Select an option

  • Save yandroidUA/ed1e67c90182e6ae83a8408de413c55c to your computer and use it in GitHub Desktop.

Select an option

Save yandroidUA/ed1e67c90182e6ae83a8408de413c55c to your computer and use it in GitHub Desktop.
NSData to ByteArray
@OptIn(ExperimentalForeignApi::class, BetaInteropApi::class)
internal inline fun ByteArray.toData(offset: Int = 0, length: ULong = size.toULong()): NSData {
if (isEmpty()) return NSData()
val pinned = pin()
return NSData.create(
bytesNoCopy = pinned.addressOf(offset),
length = length,
deallocator = { _, _ -> pinned.unpin() }
)
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun NSData.toByteArray(): ByteArray {
val size = length.toInt()
val byteArray = ByteArray(size)
if (size > 0) {
byteArray.usePinned { pinned ->
memcpy(pinned.addressOf(0), this.bytes, this.length)
}
}
return byteArray
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment