Swift 将字符串转换为缓冲区中的字节

Swift 将字符串转换为缓冲区中的字节,swift,unsafe-pointers,Swift,Unsafe Pointers,我有一个只包含ASCII字符的swift字符串。我必须将它们放在一个char*缓冲区中,然后将其转换为void*并以相反的方式执行此过程以获得回复的字符串 例如: bool query(const void* queryString, byte queryLength, void* replyBuffer, byte bufferLength); 因此,我必须设置两个缓冲区。一个包含我的查询字符串,另一个包含回复,大小为180字节 如何设置这两个缓冲区并来回复制字符串?我试图探索\u brid

我有一个只包含ASCII字符的swift字符串。我必须将它们放在一个char*缓冲区中,然后将其转换为void*并以相反的方式执行此过程以获得回复的字符串

例如:

bool query(const void* queryString, byte queryLength, void* replyBuffer, byte bufferLength);
因此,我必须设置两个缓冲区。一个包含我的查询字符串,另一个包含回复,大小为180字节


如何设置这两个缓冲区并来回复制字符串?我试图探索
\u bridgeToObjectiveC().utf8String
ans以及UnsafemtablePointer。。。但是我觉得很失落…

这就是如何设置缓冲区并将其传递给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
是一个以UTF-8表示字符串的数组, 和
replyBuffer
包含指定数量的零字节的数组

数组分别通过
queryBuffer
&replyBuffer
传递给函数,该函数将指针传递给元素存储器 到C函数

如果结果缓冲区在返回时用以null结尾的C字符串填充 然后您可以使用创建一个Swift字符串

let resultString = String(cString: replyBuffer)

以下是设置缓冲区并将其传递给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
是一个以UTF-8表示字符串的数组, 和
replyBuffer
包含指定数量的零字节的数组

数组分别通过
queryBuffer
&replyBuffer
传递给函数,该函数将指针传递给元素存储器 到C函数

如果结果缓冲区在返回时用以null结尾的C字符串填充 然后您可以使用创建一个Swift字符串

let resultString = String(cString: replyBuffer)

谢谢你的回复。
&Array(repeating:UInt8(0),count:180)
让receiveBuffer=UnsafeMutablePointer.allocate(capacity:256)receiveBuffer.initialize(repeating:0,count:256)
之间的区别是什么?
数组(…)
创建本地数组变量,当当前作用域离开时,该变量将自动处理。您可以使用
unsafemeutablepointer.allocate(…)
来分配内存,因此您必须记住最终要释放它,否则会导致内存泄漏。谢谢您的回复。
&Array(repeating:UInt8(0),count:180)
让receiveBuffer=UnsafeMutablePointer.allocate(capacity:256)receiveBuffer.initialize(repeating:0,count:256)
之间的区别是什么?
数组(…)
创建本地数组变量,当当前作用域离开时,该变量将自动处理。您还可以使用分配内存的
UnsafeMutablePointer.allocate(…)
,因此您必须记住最终要释放它,否则会导致内存泄漏。