Swift String ke byte dalam buffer

Saya memiliki String cepat yang hanya berisi karakter ASCII. Saya harus meletakkannya di buffer char* yang kemudian saya transmisikan ke void* dan melakukan proses ini secara terbalik untuk mendapatkan string yang dibalas.

Contoh:

bool query(const void* queryString, byte queryLength, void* replyBuffer, byte bufferLength);

Jadi, saya harus menyiapkan dua buffer. Satu yang akan menampung string kueri saya dan satu lagi, berukuran 180 byte, untuk menampung balasan.

Bagaimana cara mengatur kedua buffer tersebut dan menyalin string bolak-balik? Saya mencoba menjelajahi _bridgeToObjectiveC().utf8String dan juga unsafemutablepointer... tapi saya merasa tersesat...


person Adeline    schedule 14.06.2018    source sumber


Jawaban (1)


Inilah cara Anda mengatur buffer dan meneruskannya ke fungsi C:

let queryString = "Query ..."

let queryBuffer = Array(queryString.utf8)
var replyBuffer = Array(repeating: UInt8(0), count: 180)

let result = query(queryBuffer, numericCast(queryBuffer.count), &replyBuffer, numericCast(replyBuffer.count))

queryBuffer adalah array dengan representasi string UTF-8, dan replyBuffer adalah array yang berisi jumlah nol byte tertentu.

Array diteruskan ke fungsi dengan queryBuffer dan &replyBuffer, masing-masing, yang meneruskan pointer ke penyimpanan elemen ke fungsi C.

Jika buffer hasil diisi dengan string C yang diakhiri dengan null sebagai imbalannya, maka Anda dapat membuat string Swift dengan

let resultString = String(cString: replyBuffer)
person Martin R    schedule 14.06.2018
comment
Terima kasih untuk balasan Anda. Apa perbedaan antara &Array(repeating: UInt8(0), count: 180) dan let receiveBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 256) receiveBuffer.initialize(repeating: 0, count: 256) ? - person Adeline; 14.06.2018
comment
Array(...) membuat variabel array lokal, yang secara otomatis dibuang ketika cakupan saat ini tersisa. Anda juga dapat menggunakan UnsafeMutablePointer<UInt8>.allocate(...), yang mengalokasikan memori, jadi Anda harus ingat untuk melepaskannya pada akhirnya, jika tidak, Anda akan mengalami kebocoran memori. - person Martin R; 14.06.2018