C# 从C++到C转换代码的问题 我把一些代码从一个C++应用程序中转换成了C.的C++,我有一个库,我使用的是一个缓冲区,但是我的C知识缺乏,转换有点复杂。

C# 从C++到C转换代码的问题 我把一些代码从一个C++应用程序中转换成了C.的C++,我有一个库,我使用的是一个缓冲区,但是我的C知识缺乏,转换有点复杂。,c#,c++,bytebuffer,C#,C++,Bytebuffer,当我查询我的应用程序时,我只是简单地使用字节写程序,而没有像bf.Write-1和bf.writestring那样正确地转换任何值。在这里,查询程序至少查询它,只是得到错误的信息。当我将值正确地转换为long、byte、short等时,它会完全中断,查询应用程序甚至不再看到它 C++代码段 void PlayerManager::BuildReplyInfo() { // Delete the old packet g_ReplyInfo.Reset(); g_R

当我查询我的应用程序时,我只是简单地使用字节写程序,而没有像bf.Write-1和bf.writestring那样正确地转换任何值。在这里,查询程序至少查询它,只是得到错误的信息。当我将值正确地转换为long、byte、short等时,它会完全中断,查询应用程序甚至不再看到它

C++代码段

void PlayerManager::BuildReplyInfo()
{   
    // Delete the old packet
    g_ReplyInfo.Reset();

    g_ReplyInfo.WriteLong(-1);
    g_ReplyInfo.WriteByte(73);
    g_ReplyInfo.WriteByte(g_ProtocolVersion.GetInt());
    g_ReplyInfo.WriteString(iserver->GetName());    
    g_ReplyInfo.WriteString(iserver->GetMapName()); 
    g_ReplyInfo.WriteString(gGameType);
}
C代码

public static byte[] ConvertStringToByteArray(string str)
{
    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    return encoding.GetBytes(str);
}
//------------------

    while (true)
    {
        data = new byte[1024];
        recv = socket.ReceiveFrom(data, ref Remote);

        Console.WriteLine("Message length is " + recv);

        // If the length is 25 and the 5th byte is 'T' it is a A2S_INFO QUERY
        if (recv == 25 && data[4] == 84)
        {
            Console.WriteLine("Source Engine Query!");

            data = BuildReplyInformation();
            socket.SendTo(data, 0, data.Length, SocketFlags.None, Remote);
        }
    }
}

public static byte[] BuildReplyInformation()
{
    MemoryStream stream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(stream);

    writer.Write((long)(-1));
    writer.Write((byte)(73)); // Steam Version
    writer.Write((byte)(15)); // Protocol
    writer.Write(ConvertStringToByteArray("Minecraft Server\0")); // Hostname
    writer.Write(ConvertStringToByteArray("Map Name\0")); // Map Name
    writer.Write(ConvertStringToByteArray("tf\0")); // Game Directory
    writer.Write(ConvertStringToByteArray("Minecraft Server\0")); // Game Description
    writer.Write((short)(440));
    writer.Write((byte)(15)); // Players
    writer.Write((byte)(32)); // Max Players
    writer.Write((byte)(0)); // Bots
    writer.Write((byte)(100));
    writer.Write((byte)(119)); // 108 Linux, 119 Windows
    writer.Write((byte)(0)); // Password Boolean
    writer.Write((byte)(01)); // Vac Secured
    writer.Write(ConvertStringToByteArray("1.1.3.7\0"));

    return stream.ToArray();
}

有几个想法可能会让你走上正轨:

您确定需要UTF8作为字符串编码吗? 当您查看阵列并将其与预期结构进行比较时,您是否能够找出阵列在哪一点不符合标准?
请记住以下几点:

UTF-8字符串有时以BOM字节顺序标记开头,有时则不是。 字符串有时以长度前缀序列化,有时以null结尾。 我的建议是,重复检查原始的C++方法写字符串…要了解它对1和2的行为,然后再次检查C方法GetBytes。。。同样的。如果我记得的话,.NET二进制序列化程序会为写入的每个字符串写入长度前缀字符串,但UTF8编码器不会也不会输出空字符。UTF8编码器也可能取决于您如何使用它?输出BOM表


此外,我还怀疑\0在通过UTF8编码器时是如何写出的。您可以尝试将空标记与字符串内容分开输出,只是一个0值字节。

长c不同于C++,解决了这个问题。我想复制这个包设计,所以我可以模仿一个游戏服务器。你为什么不检查什么是真正从你的C++发送与C应用程序与规格?蒸汽字符串使用内部的ASCII编码,至少在你的链接中这样说。嗯,C++长是4字节,C长是8字节。那会是个问题吗?马吕斯,这就是问题的全部。当我把它改为一个整数而不是一个长整数时,它就工作得很好。你能把这个作为一个答案,这样我就可以给你信用了吗?