gpt4 book ai didi

c# - 如何将 byte[] 数组加载到 C# 中的结构中?

转载 作者:行者123 更新时间:2023-11-30 13:51:06 24 4
gpt4 key购买 nike

考虑以下结构,其中 usernamepassword 的长度均为 17:

struct LoginPacket
{
public int unk1;
public string username;
public string password;
}

也是这个字节数组

00 00 00 00 6A 6D 32 6D 65 00 72 00 7A 76 72 00 98 FD 18 00 A0 68 65 72 65 49 73
70 61 73 73 00 00 00 00 00 FF FF 31 2E 30 30 2E 30 30 00 00 00 C7 9D 72 00 04 00
00 31 2E 31 30 2E 32 37 00 0C 2C F6 24 16 2C F6 24 16

是否可以将这个字节数组加载到上面的结构中?有一个叫做 Marshal 的东西,但它对我来说不太适用。

最佳答案

给你,这个答案使用 .NET 中的编码系统。该结构本身包含有关如何解密字节数组的方法。如果您不能这样做,则需要手动代码。

void Main()
{
byte[] bytes = new byte[]
{
0x00, 0x00, 0x00, 0x00, 0x6A, 0x6D, 0x32, 0x6D, 0x65, 0x00, 0x72, 0x00, 0x7A, 0x76, 0x72, 0x00, 0x98, 0xFD, 0x18, 0x00, 0xA0, 0x68, 0x65, 0x72, 0x65, 0x49, 0x73,
0x70, 0x61, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x31, 0x2E, 0x30, 0x30, 0x2E, 0x30, 0x30, 0x00, 0x00, 0x00, 0xC7, 0x9D, 0x72, 0x00, 0x04, 0x00,
0x00, 0x31, 0x2E, 0x31, 0x30, 0x2E, 0x32, 0x37, 0x00, 0x0C, 0x2C, 0xF6, 0x24, 0x16, 0x2C, 0xF6, 0x24, 0x16
};

var packet = BytesToStructure<LoginPacket>(bytes);
packet.Dump();
}

static T BytesToStructure<T>(byte[] bytes)
{
int size = Marshal.SizeOf(typeof(T));
if (bytes.Length < size)
throw new Exception("Invalid parameter");

IntPtr ptr = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, ptr, size);
return (T)Marshal.PtrToStructure(ptr, typeof(T));
}
finally
{
Marshal.FreeHGlobal(ptr);
}
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet=CharSet.Ansi)]
struct LoginPacket
{
public int unk1;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst=17)]
public string username;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=17)]
public string password;
}

LINQPad 中执行时你得到这个:

unk1: 0 username: jm2me password: hereIspass

关于c# - 如何将 byte[] 数组加载到 C# 中的结构中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5076302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com