【问题标题】:Method difference between languages (Python->C#)语言之间的方法差异(Python->C#)
【发布时间】:2013-12-24 18:29:56
【问题描述】:

我正在尝试从 C# 中的 Python 程序中重现一系列代码。在 Python 中,我有:

element1, element2 = struct.unpack('!hh', data[2:6])

上述语句从短短(网络字节顺序)格式的数据“子字符串”中解包。结果 (element1,element2) 的值为:9616

我在 C# 中的尝试是:

byte[] bytesOfInterval = ASCIIEncoding.ASCII.GetBytes (data.Substring (2, 4));
using (MemoryStream stream = new MemoryStream(bytesOfInterval)) {
    using (BinaryReader reader = new BinaryReader(stream)) {
        Logger.Trace (reader.ReadInt16().ToString());
        Logger.Trace (reader.ReadInt16().ToString());
    }
}

它输出:245764096

如您所见,Python 程序的输出与 C# 程序的输出略有不同。为了验证“子字符串”(输入),我将它们编码为十六进制格式,看看是否有任何区别。它们都等于00600010,因此输入相同输出不同。 为什么?

注意事项:

【问题讨论】:

    标签: c# python unpack binaryreader


    【解决方案1】:

    我认为这是一个endianness 问题,例如试试这个

    Int16 x1 = 4096;  
    var x2 = IPAddress.HostToNetworkOrder(x1);
    

    x2 将为 1624576 => 96 相同)

    所以你可以使用IPAddress.HostToNetworkOrder 方法。

    【讨论】:

    • 不要将HostToNetworkOrder 用于通用的字节序交换,尤其是与它所说的相反(将网络顺序转换为主机顺序)......这就是BitConverter 的用途。有关示例代码,请参阅链接文档。
    • 或者只看this question 了解如何很好地包装它。 (我更愿意将字节序传递给构造函数,如果是!= BitConverter.IsLittleEndian,则进行交换,而不是总是在一个类中交换而不是在另一个类中……但这是很好的示例代码。)
    猜你喜欢
    • 2020-07-30
    • 2021-01-15
    • 2019-01-20
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2012-11-14
    • 2016-05-10
    相关资源
    最近更新 更多