C# - 字节转换不能正常工作
C# - Bytes converting doesn't not work as it should
我正在使用 Source 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("Word", 3));结果将是正方形标记。我也尝试使用编码。UTF8.GetString(),但结果相同。
数据包结构可以在这里找到:https://developer.valvesoftware.com/wiki/Source_RCON_Protocol#Basic_Packet_Structure
我不只是弄清楚我做错了什么,因为我什至不熟悉字节之类的东西。 PS。在 C# 中为 Source RCON 协议文档发布的示例应用程序是乱码,因为人们使用了太多的 OOP 并创建了数百万个 class 文件,所以我什至找不到正确的东西。
一个字节是8位。这意味着像 Size
这样的值,根据规范是一个 32 位小端无符号整数,将需要 4 个字节(32 ÷ 8 = 4)。
要将 32 位信息放入四个字节,您必须将其拆分。将此视为将一个四位数分成四个字符串,每个字符串一个。除了我们在二进制中工作,所以它有点复杂。我们必须进行一些移位和屏蔽,以便将我们想要的位放入每个 "string."
规范要求 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];
}
我正在使用 Source 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("Word", 3));结果将是正方形标记。我也尝试使用编码。UTF8.GetString(),但结果相同。
数据包结构可以在这里找到:https://developer.valvesoftware.com/wiki/Source_RCON_Protocol#Basic_Packet_Structure
我不只是弄清楚我做错了什么,因为我什至不熟悉字节之类的东西。 PS。在 C# 中为 Source RCON 协议文档发布的示例应用程序是乱码,因为人们使用了太多的 OOP 并创建了数百万个 class 文件,所以我什至找不到正确的东西。
一个字节是8位。这意味着像 Size
这样的值,根据规范是一个 32 位小端无符号整数,将需要 4 个字节(32 ÷ 8 = 4)。
要将 32 位信息放入四个字节,您必须将其拆分。将此视为将一个四位数分成四个字符串,每个字符串一个。除了我们在二进制中工作,所以它有点复杂。我们必须进行一些移位和屏蔽,以便将我们想要的位放入每个 "string."
规范要求 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];
}