【问题标题】:Fixed/variable length structure in c# and big endian conversionc#中的固定/可变长度结构和大端转换
【发布时间】:2010-02-25 08:16:42
【问题描述】:
Struct {
 byte F1[2]
 SHORT F2
 byte F3[512]
} BPD


CBD
{
 SHORT CLENGTH
 byte DATA[]
}

以上是2个c++结构。这里 SHORT 是 2 字节有符号的。 将其转换为 C# 的最佳方法是什么?

(请注意,在第二个结构中,DATA 的长度是未定义的。)

我看到了以下两个链接。

Fixed length strings or structures in C#

Reading a C/C++ data structure in C# from a byte array

将数据读入结构后,我需要将短变量转换为大端。 (反转字节)。

【问题讨论】:

    标签: c# c++ structure endianness


    【解决方案1】:

    只需要转换“short”。大/小端平台上相同的字节数组。

    所以,只需读取结构并执行以下操作:

    data.F2 = ((uint)data.F2 >> 8) | ( ((uint)data.F2 & 0xFF)

    data.CLENGTH = ((uint)data.CLENGTH >> 8) | ( ((uint)data.CLENGTH & 0xFF)

    【讨论】:

    • 感谢您的回复。我的第一个问题仍然存在。从字节数组中提取数据的最佳方法。将其转换为结构?将字节数据放入类构造函数并将其处理成类?我有 100 多个结构要处理,它们最多嵌套 10 层。
    • 对于第一个结构 - 是的,“C# 值类型”是最优的。对于第二种结构,最好将其替换为一个动态数组。
    • 我需要隐蔽的不仅是short,还需要LONG、DOUBLE等。根据我的规范,如果你的系统使用little-endian顺序,占用超过一个字节的数据类型应该被旋转(字节反转)。
    • 是的,除了 'char'、'byte' 和 'array of chars' 之外的所有基本类型都必须转换。
    【解决方案2】:

    自己解决了。

    结构很好,但如果您不打算修改任何数据类,最好使用。 我在 c# 中为 c++ 结构创建了类,对于从大到小字节序的转换,我创建了 3 个库函数,它对我有用。

    感谢大家的宝贵意见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2014-11-14
      • 2013-11-26
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      相关资源
      最近更新 更多