c를 나는이 struct
이 순서를 뒤집 :마샬링 반바지 #
[StructLayout(LayoutKind.Explicit)]
private struct Test
{
[FieldOffset(0)]
public readonly short Foo;
[FieldOffset(2)]
public readonly short Bar;
[FieldOffset(4)]
public readonly short Baz;
}
그리고 다음 바이트 배열 :
var bytes = new byte[]
{
0x00, 0x01,
0x00, 0x05,
0xFF, 0xFB
};
그리고 나는 다음과 같은 도우미 함수와 구조에 내 바이트 배열로 변환 :
private static T ByteArrayToStructure<T>(byte[] bytes)
where T : struct
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
return (T) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
}
finally
{
handle.Free();
}
}
그래서 다음과 같이 사용합니다 :
var test = ByteArrayToStructure<Test>(bytes);
Assert.AreEqual(1, test.Foo);
Assert.AreEqual(5, test.Bar);
Assert.AreEqual(-5, test.Baz);
이제 Asserts를 살펴보면 내가 기대하는 바를 분명히 볼 수 있습니다. 결과가 여기에 해당되지 않는다면이 질문이 여기에 있습니다.
그것은 첫 번째 것이 0x0100
대신 0x0001
이 될 수 있도록 뭔가, 2 바이트를 튀기는 것 같다, 두 번째 것이 아니라 0x0005
의 0x0500
로 등장, 마지막 하나는 0xFBFF
로 나타 0xFFFB
대신.
이 동작을 비활성화하는 방법이 있습니까?
감사합니다. 당신이 당신의 데이터의 엔디안을 변경하려면
https://stackoverflow.com/questions/2480116/marshalling-a-big-endian-byte-collection-into-a-struct-in-order-to-pull-out-valu –
기대치를 초과했습니다. 현실과 일치한다. 현실과 일치하도록 기대치를 업데이트하는 것을 고려하면 불일치가 사라집니다. 보고있는 동작이 올바른 것입니다. 엔디안을 조정하려면 바이트 배열 끝에서 조정하거나 마샬 러를 작성하십시오. –
"뒤집기"가 없으므로 배열의 바이트 값이 잘못되었습니다. 귀하의 컴퓨터는 리틀 엔디안이며 afaik는 C# 코드를 실행할 수있는 마지막 엔티티 중 하나가 xbox-360입니다. 그래서 작은 끝은 먼저 0x01, 0x00, 0x05 등이되어야합니다. 인간은 빅 엔디안을 선호하는 경향이 있지만 기계와의 전투에서 패배했습니다. 역사 [여기 있습니다] (https://stackoverflow.com/a/36263273/17034). –