Я пытаюсь получить байты из целого числа в [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 на этом пути.
Общие задачи заключаются в кодировании ифрейм сообщения, которые состоят из целых чисел и строк.Кодировка преобразует все в строки и добавляет ноль в конце каждой строки.Кадрирование просто добавляет к сообщению сетевой порядок байтов размером Int32.Я не могу изменить протокол, но готов рассмотреть другие подходы к достижению этой цели.
ура,
[EDIT] Обновлен код с использованием кода @ 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)
// }