-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 等),您可能会从同一字符串中获得不同的字节数组。

当您通过网络发送数据时,通常使用术语数据包。但数据包本身只是字节数组。

你得到的信息是我的用户名,我的密码。下面的 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 回答