C# .NET 응용 프로그램 중 하나가 bootp 서버로 작동해야합니다. 프로토콜은 꽤 간단하지만 바이너리 데이터를 작성/파싱하는 쉬운 방법을 모른다.C#의 bootp server에 대한 바이너리 데이터를 파싱 하시겠습니까?
어떤 아이디어 : 이 할 수있는 몇 가지 방법이있다 alt text http://www.tcpipguide.com/free/diagrams/bootpformat.png
C# .NET 응용 프로그램 중 하나가 bootp 서버로 작동해야합니다. 프로토콜은 꽤 간단하지만 바이너리 데이터를 작성/파싱하는 쉬운 방법을 모른다.C#의 bootp server에 대한 바이너리 데이터를 파싱 하시겠습니까?
어떤 아이디어 : 이 할 수있는 몇 가지 방법이있다 alt text http://www.tcpipguide.com/free/diagrams/bootpformat.png
. StructLayout과 같은 marshaling attributes을 사용하여 구조를 바이트 배열로 패딩 할 수는 있지만 이는 힘들고 노력할 가치가 없습니다.
Protobuf과 같은 특수 프레임 워크를 사용하여 필요한 구조와 일치하도록 일련 화되는 방식으로 클래스를 분류 할 수 있습니다.
내 경험에 비추어 볼 때, 이진 구조를 만드는 가장 쉽고 빠르며 유연한 방법은 MemoryStream 클래스를 사용하여 바이트 버퍼를 보유한 다음 그 주위에 BinaryWriter을 사용하여 실제로 이진 데이터를 쓰는 것입니다 스트림으로.
어쨌든 참조 할 수있는 서버가 있어야 도움이됩니다. Wireshark 또는 Microsoft 네트워크 모니터와 같은 도구를 사용하여 유선 트래픽을 캡처하여 유선 형식을 작동하는 것으로 알려진 예제와 비교할 수 있습니다.
훌륭한 정보! 지금까지 .NET에서 수행 한 모든 작업은 실제로 64 비트보다 작으므로 나중에 결국 Tim과 같은 작업을 수행해야 할 경우를 대비해 다른 옵션을 보는 것이 좋습니다. – Dave
당신은 같은 간단한 구조를 만들 수 있습니다
[Serializable]
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MyData {
public byte OpCode;
public byte HardwareType;
public byte HardwareAddressType;
public byte Hops;
public int TransactionId;
public short Seconds;
public short Flags;
public int ClientIPAddress;
public int CurrentIP;
// all other fields in the required sequence
}
및/역 직렬화 패킷을 직렬화 this blogpost의 코드를 사용합니다. 그러나 인코딩의 차이로 인해 ServerName 및 BootFilename에 문제가있을 수 있으며 각 필드에 대해 정확한 FieldOffset을 지정해야 할 수 있습니다 (자세한 내용은 this topic on msdn 참조).
희망이 도움이 될 것입니다 :)
"쉬운"당신이 0xFF, 등 복용 이외의 다른 것을 언급하고, 그것의 설명에 매핑 상수에 의해 정의 된 비트의 숫자로 그들을 쉬프트 왼쪽으로 가져 가라. 위 차트의 영역? – Dave