gpt4 book ai didi

c++ - C# 从十六进制数据中获取信息

转载 作者:行者123 更新时间:2023-11-28 08:22:42 26 4
gpt4 key购买 nike

我有这个十六进制数据:

byte[] data = new Byte[] {
0xC1, 0x3A, 0x00, 0x01, 0x5D, 0xDA, 0x47, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0xFC, 0x12, 0x00, 0x00, 0x00
};

我有 C++ 结构:

struct SERVICE
{
unsigned char c;
unsigned char size;
unsigned char headcode;
unsigned char Type;
unsigned short Port;
char ServiceName[50];
unsigned short ServiceCode;
};

我的问题是:如何从数据中获取服务名称、端口等...?

抱歉我的英语不好

最佳答案

这是一种方法:

struct SERVICE
{
public byte c;
public byte size;
public byte headcode;
public byte Type;
public ushort Port;
public string ServiceName;
public ushort ServiceCode;
};

string GetNullTerminatedString(byte[] data, Encoding encoding)
{
int index = Array.IndexOf(data, (byte)0);
if (index < 0)
{
Debug.WriteLine("No string terminator found.");
index = data.Length;
}

return encoding.GetString(data, 0, index);
}

SERVICE ByteArrayToService(byte[] array, Encoding encoding)
{
using (MemoryStream stream = new MemoryStream(array))
{
using (BinaryReader reader = new BinaryReader(stream))
{
SERVICE service = new SERVICE();
service.c = reader.ReadByte();
service.size = reader.ReadByte();
service.headcode = reader.ReadByte();
service.Type = reader.ReadByte();
service.Port = reader.ReadUInt16();
service.ServiceName = GetNullTerminatedString(reader.ReadBytes(50), encoding);
service.ServiceCode = reader.ReadUInt16();
return service;
}
}
}

void Main(string[] args)
{
byte[] data = new Byte[]
{
0xC1, 0x3A, 0x00, 0x01, 0x5D, 0xDA, 0x47, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0xFC, 0x12, 0x00, 0x00, 0x00
};

SERVICE s = ByteArrayToService(data, Encoding.Default);
}

这假设二进制数组使用与您的体系结构相同的字节顺序。如果不是这种情况,您可以使用 MiscUtil 中的 EndianBinaryReader。图书馆。

编辑:这也是一个很好的解决方案,完全避免了读者。但是,您不能直接指定用于字符串的编码,并且结构的内存布局必须与字节数组中使用的布局相匹配。

[StructLayout(LayoutKind.Sequential)]
struct SERVICE
{
public byte c;
public byte size;
public byte headcode;
public byte Type;
public ushort Port;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string ServiceName;
public ushort ServiceCode;
};

SERVICE ByteArrayToService(byte[] array)
{
GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
SERVICE service = (SERVICE)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SERVICE));
handle.Free();
return service;
}

关于c++ - C# 从十六进制数据中获取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213406/

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