[英]In Swift (Darwin), why does exit() take an Int32 instead of a UInt8?
[英]Swift 4 Int32 to [UInt8]
我試圖將字節從整數轉換為[UInt8]以通過有線協議發送它們。 雖然我找到了適用於Swift 2/3的答案,但沒有一種解決方案適用於Swift 4。
以下代碼段用於為小消息大小編碼消息(只是原始字符串數據以網絡字節順序Int32大小為前綴):
func send(message: String) {
let messageSize = message.utf8.count
let encodedMessageSize = Int32(messageSize).bigEndian
let frameSize = messageSize + 4
var buffer: [UInt8] = Array()
buffer.append(0)
buffer.append(0)
buffer.append(0)
buffer.append(UInt8(messageSize))
buffer.append(contentsOf: message.utf8)
outputStream.write(buffer, maxLength: frameSize)
}
我也嘗試過直接使用原始指針,但沿該途徑也無法使Swift 4正常工作。
總體任務是對由整數和字符串組成的消息進行編碼和框架化。 編碼會將所有內容轉換為字符串,並在每個字符串的末尾添加一個null。 該框架只是在消息前加上網絡字節順序Int32大小。 我無法更改協議,但願意考慮實現此目的的其他方法。
干杯,
[編輯]使用@MartinR的代碼(帶有@Hamish的建議)更新了代碼。 同時,總體任務也取得了一些進展。
func encodeMessagePart(_ message: String) -> [UInt8] {
var buffer: [UInt8] = Array(message.utf8)
buffer.append(0)
return buffer
}
func encodeMessagePart(_ message: Int) -> [UInt8] {
return encodeMessagePart("\(message)")
}
func frameMessage(_ buffer: [UInt8]) -> [UInt8] {
let bufferSize = buffer.count
var encodedBufferSize = Int32(bufferSize).bigEndian
let encodedBufferSizeData = withUnsafeBytes(of: &encodedBufferSize) { Data($0) }
var frame: [UInt8] = Array()
frame.append(contentsOf: encodedBufferSizeData)
frame.append(contentsOf: buffer)
return frame
}
func sendMessage(_ buffer: [UInt8]) {
let frame = frameMessage(buffer)
outputStream.write(frame, maxLength: frame.count)
}
func sendMessage(_ message: String) {
let encodedPart = encodeMessagePart(message)
sendMessage(encodedPart)
}
// func sendMessage(_ messages: Encodable...) {
// var buffer: [UInt8] = Array()
// for message in messages {
// let b = encodeMessagePart(message)
// buffer.append(contentsOf: b)
// }
// sendMessage(buffer)
// }
您可以使用以下命令從整數創建Data
值
let encodedMessageSize = Int32(messageSize).bigEndian
let data = withUnsafeBytes(of: encodedMessageSize) { Data($0) }
(在4.2之前的Swift版本中,您必須編寫
var encodedMessageSize = Int32(messageSize).bigEndian
let data = withUnsafeBytes(of: &encodedMessageSize) { Data($0) }
代替。)
然后可以將數據附加到數組
buffer.append(contentsOf: data)
或者,您可以使用data
緩沖區而不是數組:
func send(message: String) {
let messageSize = message.utf8.count
let encodedMessageSize = Int32(messageSize).bigEndian
var data = withUnsafeBytes(of: encodedMessageSize) { Data($0) }
data.append(Data(message.utf8))
let amountWritten = data.withUnsafeBytes { [count = data.count] in
outputStream.write($0, maxLength: count)
}
}
最后請注意, write()
方法寫入的字節數可能少於提供的字節數(例如,在網絡連接上),因此您應始終檢查返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.