swift - 线程 6:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)
问题描述
我正在从数据中读取字节。但是在第一次迭代while循环后崩溃了。
注意:这不是索引越界问题。
func readData(data: Data)
{
if isPacketRecieved == true
{
SocketManager.shared.connectionOpened()
isPacketRecieved = false
}
// 1
var packetBuffer = Data()
// 2
bufferManager.writeDataToBuffer(data: data)
// 3
while(bufferManager.getUnusedBufferSize() >= MAX_PACKET_SIZE){
// 3.1
packetBuffer.removeAll()
packetBuffer = bufferManager.readDataFromBuffer(size: Int(MAX_PACKET_SIZE))
self.parsePacket(data: packetBuffer)
} // -- while
}
func parsePacket(data: Data){
if data.count == MAX_PACKET_SIZE {
let dataHeader = data[0 ..< 10] ===> // here I am getting crash
let dataBody = data [10 ..< 30]
guard let dataStreamHeader = SocketStream(data: dataHeader) else {return}
guard let dataStreamBody = SocketStream(data: dataBody) else {return}
// ź
guard let exchange = dataStreamHeader.readString(1) else {
return
}
guard let scripCode = dataStreamHeader.readInt() as? Int32 else {
return
}
guard let time = dataStreamHeader.readInt() as? Int32 else {
return
}
guard let type = dataStreamHeader.readString(1) else {
return
}
print("Packet Type :: \(type)")
let responseHeader = ResponseHeaderPacket(exchangeCode: exchange, scripCode: Int(scripCode), time: Int(time), type: type)
var pckt: BroadcasterPacket!
switch type {
case ONE:
var loginReq = sLoginRequest()
let loginData = loginReq.sendAcknowledgementPacket()
manager?.sendAcknowledgementData(data: loginData)
break
case A :
pckt = Packet_A(stream: dataStreamBody, header: responseHeader)
break
case G :
pckt = Packet_G(stream: dataStreamBody, header: responseHeader)
break
case H :
pckt = Packet_H(stream: dataStreamBody, header: responseHeader)
break
case g :
pckt = Packet_g(stream: dataStreamBody, header: responseHeader)
break
case m :
pckt = Packet_m(stream: dataStreamBody, header: responseHeader)
break
case B,C,D,E,F :
pckt = Packet_MarketDepth(stream: dataStreamBody, header: responseHeader)
manageDepthPacket(packet: pckt! as! Packet_MarketDepth)
return
case Z :
pckt = Packet_Z(stream: dataStreamBody, header: responseHeader)
break
case X :
pckt = Packet_X(stream: dataStreamBody, header: responseHeader)
break
default:
break
}
guard let packet = pckt else {
return
}
print("ScropCode :\(packet.header.scripCode)")
quoteObject(packet: packet)
}
}
解决方案
推荐阅读
- javascript - 如何根据布尔值自动移动 JSON 数据
- c++ - OpenCV x86 缺少数百个 DLL
- php - 访问 CURL 请求的结果
- python - 根据最大值(最后一项)、最小值(第一项)和使用二分搜索的搜索值估计要搜索的项的位置
- python - 字符串未正确从 pandas 数据帧输出到 .CSV
- apache-spark - 如何知道火花中一个阶段使用的核心数量
- java - Apache Commons CSV 不会忽略缺失的列
- python - python package_data vs data_files vs extra_files
- android - 如何在 android 的 PrintManager 中添加缩放功能?
- angular - 如何在 Angular 中使用带有声明 .d.ts 的 .js 文件