私は構造体オブジェクトを持っています。また、その入力はペイロードです。今私はpacket
という名前のmutableDataを作成しています、そしてそれは変更可能なバイトはICMPHeader構造体を参照しています。NSMutableDataのバイトからUnsafeMutableRawPointerへの値がmutableDataの値を更新しない
struct ICMPHeader {
var type:UInt8
var code:UInt8
var checksum:UInt16
var identifier:UInt16
var sequenceNumber:UInt16
};
func createPacket(payload:NSData) -> NSData(){
var packet:NSMutableData?
var icmpPtr:ICMPHeader = ICMPHeader(type: 0, code: 0, checksum: 0, identifier: 0, sequenceNumber: 0)
packet = NSMutableData(length: Int(MemoryLayout<ICMPHeader>.size + payload.length))
if packet != nil {
icmpPtr = packet!.mutableBytes.assumingMemoryBound(to: ICMPHeader.self).pointee
icmpPtr.type = type
icmpPtr.code = 0
icmpPtr.checksum = 0
icmpPtr.identifier = CFSwapInt16BigToHost(identifier)
icmpPtr.sequenceNumber = CFSwapInt16HostToBig(identifier)
memcpy(&icmpPtr + 1, payload.bytes, payload.length)
if (requiresChecksum) {
icmpPtr.checksum = in_cksum(packet!.bytes, bufferLen: packet!.length);
}
}
return packet
}
変更可能なバイトが正常に構造体へのバインドさばかりされており、値も構造体ICMPHeader
に更新されてきています。
structの値が変更されて、変更可能なデータの値が変更されないpacket
。
structを作成した後でパケットを再作成しようとすると、クラッシュしています。
package = NSMutableData(bytes: unsafeBitCast(icmpPtr, to: UnsafeMutableRawPointer.self), length: Int(MemoryLayout<ICMPHeader>.size + payload.length))