【发布时间】:2011-01-29 14:56:39
【问题描述】:
有一个关于 reading a C/C++ data structure in C# from a byte array 的有见地的问题,但我无法让代码适用于我的大端(网络字节顺序)字节集合。 (编辑:请注意,我真正的结构不止一个字段。)有没有办法将字节编组为结构的大端版本,然后提取框架字节序中的值(主机的字节序) ,通常是小端)?
(注意,反转字节数组将不起作用 - 每个值的字节必须反转,这不会为您提供与反转所有字节相同的集合。)
这应该总结我在寻找什么(LE=LittleEndian,BE=BigEndian):
void Main()
{
var leBytes = new byte[] {1, 0, 2, 0};
var beBytes = new byte[] {0, 1, 0, 2};
Foo fooLe = ByteArrayToStructure<Foo>(leBytes);
Foo fooBe = ByteArrayToStructureBigEndian<Foo>(beBytes);
Assert.AreEqual(fooLe, fooBe);
}
[StructLayout(LayoutKind.Explicit, Size=4)]
public struct Foo {
[FieldOffset(0)]
public ushort firstUshort;
[FieldOffset(2)]
public ushort secondUshort;
}
T ByteArrayToStructure<T>(byte[] bytes) where T: struct
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(T));
handle.Free();
return stuff;
}
T ByteArrayToStructureBigEndian<T>(byte[] bytes) where T: struct
{
???
}
其他有用的链接:
Byte of a struct and onto endian concerns
A little more on bytes and endianness (byte order)
Read binary files more efficiently using C#
【问题讨论】:
-
看看这个:stackoverflow.com/a/2624377/1254743 它做得更加细粒度,如果需要,您可以轻松更改。而且你不需要构建你的结构两次(如果你有嵌套的结构特别好)。
-
我认为 PODCaster 库(zer7.com/software/podcaster 和 NuGet 上)可能是针对这个问题的,但老实说,即使从示例中我也无法判断它应该如何使用。
标签: .net interop mono legacy endianness