struct 객체가 있습니다. 그리고 그 입력은 페이로드입니다. 이제는 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
업데이트 얻고있다.
구조체의 값을 변경하면 변경 가능한 데이터 값이 변경되지 않습니다 packet
.
그리고 struct를 만든 후 패킷을 다시 만들려고하는 경우 충돌이 발생합니다.
package = NSMutableData(bytes: unsafeBitCast(icmpPtr, to: UnsafeMutableRawPointer.self), length: Int(MemoryLayout<ICMPHeader>.size + payload.length))