首页 > 解决方案 > 使用 Swift 在输出流上发送字节

问题描述

我正在使用一个自定义网络协议,该协议需要一个精确的字节序列来进行某种握手,例如,第一次调用应该发送一个像这样的主体:

0003joy那,翻译成[UInt8]应该是[0x00,0x00,0x00,0x03,0x6a,0x6f,0x79] (请注意,前4个数字不应该转换为字符......我正在发送数值,根据协议请求)

我正在尝试将此序列发送到 anoutputstream但我想知道我遵循的步骤是否正确,这是我的代码...您是否看到任何奇怪的东西可能会阻止此序列到达服务器?

// 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)
}

另外,我需要将字节序列转换为数据吗?有没有办法将字节序列直接发送到套接字而不将其转换为数据?

标签: iosswift

解决方案


我看不出您的代码有任何问题,但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)
}

推荐阅读