-2

私はいつも、ゲームが次のようなパケットをどのように生成できるのか疑問に思っていました:

22 00 11 00 6D 79 75 73 65 72 6E 61 6D 65 00 00 00 00 00 00 6D 79 70 61 73 73 77 6F 72 64 00 00 00 00 00 00

LENGTH-HEADER-USERNAME-PASSWORD

ゲーム コードでは、どのような関数を使用する必要がありますか、またはそのようなものをどのように記述しますか? それは単にEncoding.ASCII.GetBytes("Some String Values")ですか?私はそれがそのように書かれているとは思わないが。

私が誰かにそう尋ねようとするたびに、彼は私がパケットを分析したいと思っています。わかりません - 上記のようなパケットを C# で作成するために何をする必要があるか知りたいです。

4

2 に答える 2

6

あなたが入れたサンプルコードは、文字列をバイト配列に変換する必要があります。使用するエンコーディング (ASCII、Unicode など) によっては、同じ文字列から異なるバイト配列を取得する場合があります。

パケットという用語は、通常、ネットワーク経由でデータを送信するときに使用されます。しかし、パケット自体は単なるバイト配列です。

あなたが持っている情報は、myUsername、myPassword です。以下の C# コードが翻訳されます。

        byte[] packet = new byte[] { 0x22, 0x00, 0x11, 0x00, 0x6D, 0x79, 0x75, 0x73, 0x65, 0x72, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x79, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6F, 0x72, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        string test = Encoding.ASCII.GetString(packet);
        Console.WriteLine(test);
        Console.ReadKey();

似たようなものを作成するには、次のようにします。

    const int HeaderLength = 2;
    const int UsernameMaxLength = 16;
    const int PasswordMaxLength = 16;
    public static byte[] CreatePacket(int header, string username, string password)//I assume the header's some kind of record ID?
    {
        int messageLength = UsernameMaxLength + PasswordMaxLength + HeaderLength;
        StringBuilder sb = new StringBuilder(messageLength+ 2);
        sb.Append((char)messageLength);
        sb.Append(char.MinValue);
        sb.Append((char)header);
        sb.Append(char.MinValue);
        sb.Append(username.PadRight(UsernameMaxLength, char.MinValue));
        sb.Append(password.PadRight(PasswordMaxLength, char.MinValue));
        return Encoding.ASCII.GetBytes(sb.ToString()); 
    }

次に、このコードを次のように呼び出します。

byte[] myTest = CreatePacket(17, "myusername", "mypassword");
于 2012-10-12T23:28:14.977 に答える
0

もちろん、文字列ビルダーを使用することは、パケットの構造化とはかけ離れています。byte[] を使用し、それにインデックスで値を追加する必要があります。

于 2012-10-31T01:09:28.000 に答える