[英]Code change vb.net to c#
我不知道在哪里问这样的问题,所以可能马上就对不起。
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#中的样子吗? 尝试了我的自我,但始终出现错误Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)
Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)
强制Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)
尝试进行强制转换,然后由于不需要强制转换而出现错误
我的代码:
private byte[] RCON_Command(string command, int serverdata)
{
byte[] packet = new byte[command.Length + 13];
packet[0] = command.Length + 9;
packet[4] = 0;
packet[8] = serverdata;
for (int i = 0; i < command.Length; i++)
{
packet[12 + i] = System.Text.Encoding.UTF8.GetBytes(command[i])[0];
}
return packet;
}
数据包[0]和数据包[8]行中有错误
只需添加显式强制转换。 您可能要确保从32位值类型向下转换为8位类型是安全的。
packet[0] = (byte)(command.Length + 9);
...
packet[8] = (byte)serverdata;
编辑:
TheEvilPenguin也是正确的,您对GetBytes()
调用将有问题。
这就是我要解决的方法,以确保不更改现有VB.NET代码的含义:
packet[12 + i] = System.Text.Encoding.UTF8.GetBytes(new char[] {command[i]})[0];
而且,还有更多细节:
在VB.NET中声明数组时,将定义最大数组索引。 在C#中,数组声明中的数字表示数组中元素的数量。 这意味着在从VB.NET到C#的转换中,要保持相同的行为,您需要在数组声明中的数字上加上+ 1
:
byte[] packet = new byte[command.Length + 13 + 1]; // or + 14 if you want
您需要在分配它们之前将这两个项目转换为字节。 我在下面完成的另一种选择是更改方法以将serverdata
作为byte
而不是int
接受-占用多余的字节只是为了扔掉它们是没有意义的。
另一个问题是在for
循环中- string
的索引器返回一个字符, UTF8.GetBytes()
无法接受该字符。 我认为我的翻译应该可以,但是您需要对其进行测试。
private byte[] RCON_Command(string command, byte serverdata)
{
byte[] packet = new byte[command.Length + 13];
packet[0] = (byte)(command.Length + 9);
packet[4] = 0;
packet[8] = serverdata;
for (int i = 0; i < command.Length; i++)
{
packet[12 + i] = System.Text.Encoding.UTF8.GetBytes(command)[i];
}
return packet;
}
干得好。 Terik转换器没有用-该代码无法编译。 该代码运行...
private byte[] RCON_Command(string Command, int ServerData)
{
byte[] commandBytes = System.Text.Encoding.Default.GetBytes(Command);
byte[] Packet = new byte[13 + commandBytes.Length + 1];
for (int i = 0; i < Packet.Length; i++)
{
Packet[i] = (byte)0;
}
int index = 0;
//Packet Size (Integer)
byte[] bytes = BitConverter.GetBytes(Command.Length + 9);
foreach (var byt in bytes)
{
Packet[index++] = byt;
}
//Request Id (Integer)
bytes = BitConverter.GetBytes((int)0);
foreach (var byt in bytes)
{
Packet[index++] = byt;
}
//SERVERDATA_EXECCOMMAND / SERVERDATA_AUTH (Integer)
bytes = BitConverter.GetBytes(ServerData);
foreach (var byt in bytes)
{
Packet[index++] = byt;
}
foreach (var byt in commandBytes)
{
Packet[index++] = byt;
}
return Packet;
}
除了需要转换外,您还需要了解C#在创建数组时使用数组大小,而不是VB使用的上限-因此您需要“ 14 + Command.Length”:
private byte[] RCON_Command(string Command, int ServerData)
{
byte[] Packet = new byte[Convert.ToByte(14 + Command.Length];
Packet[0] = Convert.ToByte(Command.Length + 9); //Packet Size (Integer)
Packet[4] = 0; //Request Id (Integer)
Packet[8] = Convert.ToByte(ServerData); //SERVERDATA_EXECCOMMAND / SERVERDATA_AUTH (Integer)
for (int X = 0; X < Command.Length; X++)
{
Packet[12 + X] = System.Text.Encoding.Default.GetBytes(Command[X])[0];
}
return Packet;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.