簡體   English   中英

Swift 4 Int32至[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM