c# -字节转换不像它应该的那样工作

本文关键字:工作 字节 转换 | 更新日期: 2023-09-27 18:18:01

我正在使用源RCON协议,但是我在成功地将字符串转换为字节数组时遇到问题。

原始代码(VB.NET) + Pastebin: http://pastebin.com/4BkbTRfD

Private Function RCON_Command(ByVal Command As String, 
                              ByVal ServerData As Integer) As Byte()
     Dim Packet As Byte() = New Byte(CByte((13 + Command.Length))) {}
     Packet(0) = Command.Length + 9    'Packet Size (Integer)
     Packet(4) = 0                     'Request Id (Integer)
     Packet(8) = ServerData            'SERVERDATA_EXECCOMMAND / SERVERDATA_AUTH (Integer)
     For X As Integer = 0 To Command.Length - 1
         Packet(12 + X) = System.Text.Encoding.Default.GetBytes(Command(X))(0)
     Next
     Return Packet
End Function

我在c# + Pastebin中的当前代码:http://pastebin.com/eVv0nZCf

byte[] RCONCommand(string cmd, int serverData)
{
    int packetSize = cmd.Length + 12;
    byte[] byteList = new byte[packetSize];
    byteList[0] = (byte)packetSize;
    byteList[4] = 0;
    byteList[8] = (byte)serverData;
    for(int X = 0; X < cmd.Length; X++)
    {
        byteList[12 + X] = Encoding.ASCII.GetBytes(cmd)[X];
    }
    return byteList;
}

当我使用Encoding.ASCII时。GetString (RCONCommand("单词",3));结果将是平的。我也尝试过Encoding.UTF8.GetString(),但结果相同。

包结构可以在这里找到:https://developer.valvesoftware.com/wiki/Source_RCON_Protocol#Basic_Packet_Structure

我不只是弄清楚我做错了什么,因为我甚至不熟悉字节之类的东西。PS. c# for Source RCON Protocol文档中发布的示例应用程序是乱码的,因为人们使用了如此多的OOP并创建了数百万个类文件,所以我甚至找不到正确的东西

c# -字节转换不像它应该的那样工作

一个字节是8位。这意味着像Size这样的值,根据规范是一个32位小端无符号整数,将需要4个字节(32 ÷ 8 = 4)。

要将32位信息放入4个字节中,必须将其拆分。可以把它看作是将一个四位数的数字分成四个字符串,每个字符串对应一个数字。只不过我们用的是二进制,所以有点复杂。我们必须做一些位移位和掩码来得到我们想要的每个"字符串"的位。"

规范要求使用little-endian,所以最不重要的字节放在第一位;如果你以前没有这样做过,需要一些时间来适应。

byte[0] = size && 0xFF;
byte[1] = (size >> 8) && 0xFF;
byte[2] = (size >> 16) && 0xFF;
byte[3] = (size >> 24) && 0xFF;

如果你想依赖CLR,你可以使用BitConverter,尽管它是平台相关的,并不是所有的平台都是小端位的。

var tmp = BitConverter.GetBytes(size);
if (BitConverter.IsLittleEndian)
{
    byte[0] = tmp[0];
    byte[1] = tmp[1];
    byte[2] = tmp[2];
    byte[3] = tmp[3];
}
else  //in case you are running on a bigendian machine like a Mac
{
    byte[0] = tmp[3];
    byte[1] = tmp[2];
    byte[2] = tmp[1];
    byte[3] = tmp[0];
}