繁体   English   中英

将vb.net代码更改为C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM