C#中的Python Struct.Pack

时间:2013-12-21 15:19:31

标签: c# python memorystream pack

我试图在C#中重现以下语句。如过程所示, packlength 是根据'!l'格式打包的字符串,表示 long值(以网络字节顺序 - 大端)。

packlength=struct.pack('!l', len(packetdata)+10)

我尝试了以下内容:

using (MemoryStream stream = new MemoryStream()) {
        using (BinaryWriter writer = new BinaryWriter(stream)) {
                    writer.Write ((long)(packetData.Length+10));
        }
}

程序是否正确?如果是这样,我如何从内存流中访问结果“字符串”?

2 个答案:

答案 0 :(得分:1)

等效的C#是

var bytes=BitConverter.GetBytes((long)packetdata.length) 

更新: Jon skeet有一个非常好的库用于播放字节顺序。检查以下链接

http://www.yoda.arachsys.com/csharp/miscutil/

答案 1 :(得分:1)

您可以使用此代码:

byte[] bytes = BitConverter.GetBytes(
    IPAddress.HostToNetworkOrder((long)packetdata.length + 10)
);

这读取得非常糟糕,因此您希望将IPAddress.HostToNetworkOrder作为静态方法包装在另一个类中,以提高可行性。毕竟,谁想在进行网络订单转换主机时看到IPAddress?

虽然你的Python代码使用字符串来保存缓冲区,但它们并不是真正的字符串。为什么你这里有一个字节数组,这就是上面代码产生的结果。