2010-02-10 6 views
4

J'ai besoin d'une de mes applications C# .NET pour agir en tant que serveur de démarrage. Le protocole est assez simple mais je ne connais pas un moyen facile de construire/analyser les données binaires.Données binaires d'analyse pour le serveur de démarrage C#?

Toutes les idées: alt text http://www.tcpipguide.com/free/diagrams/bootpformat.png

+0

Je suppose que par "facile" vous faites référence à autre chose que de prendre 0xFF, etc, et à gauche les déplacer par un nombre de bits définis par des constantes qui correspondent à la description de la zones dans le tableau ci-dessus? – Dave

Répondre

1

Il y a deux manières de le faire. Vous pourriez être en mesure de jouer avec le marshaling attributes tel que StructLayout pour emballer une structure dans un tableau d'octets, mais cela est probablement difficile et ne vaut pas la peine.

Vous pouvez utiliser un framework spécialisé tel que Protobuf pour attribuer une classe de manière à ce qu'elle soit sérialisée pour correspondre à la structure dont vous avez besoin. Mais d'après mon expérience, la méthode la plus simple, la plus rapide et la plus flexible pour créer une structure binaire est d'utiliser une classe MemoryStream pour contenir un tampon d'aubes, puis d'utiliser un BinaryWriter pour écrire les données binaires dans le flux.

Dans tous les cas, il est utile d'avoir un serveur de travail à référencer. Utilisez un outil tel que Wireshark ou Microsoft Network Monitor pour capturer le trafic filaire afin de pouvoir comparer votre format de fil à un exemple connu pour fonctionner.

+0

bonne info! Tout ce que j'ai fait jusqu'à présent dans .NET est en fait inférieur à 64 bits, donc c'est agréable de voir d'autres options au cas où je devrais finalement faire quelque chose comme Tim (très probablement). – Dave

2

Vous pouvez créer une structure simple comme:

[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 
} 

et utiliser le code de this blogpost sérialiser/paquets délinéariser. Mais il peut y avoir un problème avec ServerName et BootFilename en raison de différences dans l'encodage et probablement vous devez spécifier exact FieldOffset pour chacun des champs (voir this topic on msdn pour plus de détails). J'espère que cela va aider :)

Questions connexes