Отправка байтов на выходной поток с помощью Swift - PullRequest
0 голосов
/ 20 октября 2019

Я работаю с пользовательским сетевым протоколом, который требует точной последовательности байтов для выполнения своего рода рукопожатия, как, например, первый вызов должен отправить тело вроде:

0003joy, переведенное в[UInt8] должно быть [0x00,0x00,0x00,0x03,0x6a,0x6f,0x79] (обратите внимание, что первые 4 числа не должны быть преобразованы в символы ... Я отправляю числовое значение в соответствии с запросом протокола)

Я пытаюсь отправитьэта последовательность до outputstream, но мне интересно, если шаги, которые я выполняю, правильные, вот мой код ... Вы видите что-нибудь странное, что может помешать этой последовательности добраться до сервера?

// Create Bytes sequence
let bytes:[UInt8] = [0x00,0x00,0x00,0x03,0x6a,0x6f,0x79]

// Convert Bytes array do Data
let dt = Data(bytes)

// Send Data to stream 
_ = dt.withUnsafeBytes {
    guard let pointer = $0.baseAddress?.assumingMemoryBound(to: UInt8.self) else {
        return
    }
    outputStream.write(pointer, maxLength: dt.count)
}

Кроме того, нужно ли преобразовывать последовательность байтов в данные? Есть ли способ отправить последовательность байтов непосредственно в сокет без преобразования его в данные?

1 Ответ

1 голос
/ 20 октября 2019

Я не вижу ничего плохого в вашем коде, но преобразование в Data не требуется:

bytes.withUnsafeBytes {
    guard let pointer = $0.baseAddress?.assumingMemoryBound(to: UInt8.self) else {
        return
    }
    outputStream.write(pointer, maxLength: bytes.count)
}

, поскольку [UInt8] соответствует ContiguousBytes.

На самом делетакже возможно следующее:

bytes.withUnsafeBufferPointer {
    guard let baseAddress = $0.baseAddress else { return }
    outputStream.write(baseAddress, maxLength: bytes.count)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...