我总是想知道游戏如何生成这样的数据包:
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#中创建一个类似上面的数据包。
答案 0 :(得分:5)
您放置的示例代码应将字符串转换为字节数组。根据您使用的编码(例如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");
答案 1 :(得分:0)
当然,使用字符串构建器与数据包结构相距甚远,您必须使用byte []并通过索引向其附加值。