ios - 使用 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)
}
另外,我需要将字节序列转换为数据吗?有没有办法将字节序列直接发送到套接字而不将其转换为数据?
解决方案
我看不出您的代码有任何问题,但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)
}
推荐阅读
- javascript - 在承诺链上返回空箭头函数
- bash - 使用 awk 在 csv 文件中浮动
- python-3.x - 选择一个文件夹会更新 tkinter 中的所有条目
- react-native - 反应原生圈拖动变换平移动画
- android - 即使在清单中添加了权限,仍然显示权限错误
- r - R (read_csv2) 将列转换为逻辑并用不平衡数据集中的 NA 替换值
- javascript - 在流程中如何接受异构数组并返回该数组
- javascript - SweetAlert 弹出窗口显示时间过长
- xml - 如何将Ofbiz中的下拉菜单设为只读?
- xamarin - 使用 xamarin 表单从列表视图中删除右滑动手势