gpt4 book ai didi

c# - 如何在 C# 中编码具有未知长度字符串字段的结构

转载 作者:太空狗 更新时间:2023-10-29 19:44:35 26 4
gpt4 key购买 nike

我得到一个字节数组,我需要将它解码为 C# 结构。我知道结构的类型,它有一些字符串字段。字节数组中的字符串如下所示:前两个字节是字符串的长度,然后是字符串本身。我不知道琴弦的长度。我知道它是 Unicode!

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class User
{
int Id;//should be 1
String UserName;//should be OFIR
String FullName;//should be OFIR
}

字节数组如下所示:00,00,01,00,00,00,08,00,4F,00,46,00,49,00,52,00,00,00,08,00,4F,00,46,00,49,00,52,00,

我还发现这个链接有同样的问题未解决: loading binary data into a structure

谢谢大家奥菲尔

最佳答案

我会用 BinaryReader 来完成。这将沿着这些路线进行:

Foo ReadFoo(Byte[] bytes)
{
Foo foo = new Foo();
BinaryReader reader = new BinaryReader(new MemoryStream(bytes));
foo.ID = reader.ReadUInt32();
int userNameCharCount = reader.ReadUInt32();
foo.UserName = new String(reader.ReadChars(userNameCharCount));

int fullNameCharCount = reader.ReadUInt32();
foo.FullName = new String(reader.ReadChars(fullNameCharCount));
return foo;
}

请注意,这不能直接用于您提供的字节数组示例。字符计数和 ID 字段不是标准的小端或双端顺序。可能是这些字段是 16 位的,并且它们前面加上了 16 位的填充字段。谁生成了这个字节流?

但确切的格式对于此策略来说并不是太重要,因为您只需将 ReadInt32 更改为 ReadInt16,重新排序,无论如何,使其工作。

我不喜欢序列化器属性。那是因为它将您的内部数据结构与其交换方式耦合在一起。如果您需要支持多个版本的数据格式,则会中断。

关于c# - 如何在 C# 中编码具有未知长度字符串字段的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4843577/

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