c# - StructLayout 将字节数组转换为短数组

标签 c# arrays structlayout

很抱歉这个可怕的标题,但老实说我知道我想要什么,也不知道哪里出了问题......

基本上我有一个结构(我有 250 多个结构,但它们都遵循相同的想法),如下所示:

[StructLayout(LayoutKind.Explicit)]
public struct GenericPacket
{
    [FieldOffset(0)]
    public byte[] data;

    [FieldOffset(0)]
    public short packetid;
}

问题在于,字节数组是引用类型,而短整型数组是值类型,它不允许将 fieldoffset 设置为相同的内存位置...

我真的不想删除我编写的所有结构,只是为了以不同的方式来做。所以这是我的问题,我该如何以有效的方式使用它。基本上我要做的是:

socket.Receive(buff, 0, 0, SocketFlags.None);
GenericPacket packet = new GenericPacket();
packet.data = buff;
Console.WriteLine(packet.packetid);

它甚至拒绝编译,因为它不想生成结构/:

在有人建议其他方法之前,我这样做的原因是它需要超高速...我可以使用 ByteReader 和其他方法(例如 BitConverter),但它需要比这快一点...

我从按位移位开始,但我需要一种更“动态”的方式来做到这一点,因为在我有了数据包 ID 后,我然后用另一个结构读取它,例如:

[StructLayout(LayoutKind.Explicit)]
public struct _03k
{
    [FieldOffset(0)]
    byte[] data;

    [FieldOffset(0)]
    short packetid;
    [FieldOffset(2)]
    short @null;
    [FieldOffset(4)]
    int major;
    [FieldOffset(8)]
    int minor;
    [FieldOffset(12)]
    int build;
}

我不需要有很多内联的“按位狗屎”,我只是想要一种简单且非常快速的方法来做到这一点......似乎我得到了快速而不是简单/:

请帮忙!不安全的代码是可以的,但也更喜欢托管版本。

FAIL :(: 只是记得你可以通过装箱将值类型转换为引用类型(转换为类型对象)。但是,这确实删除了 REAL 返回类型并表示它只是一个对象,无论如何,对于 XML 文档,您可以对返回类型撒谎吗? 不起作用 D:

更新:好的,现在我有:

public struct GenericPacket
{
    public short packetid;

    public static GenericPacket ReadUsingPointer(byte[] data)
    {
        unsafe
        {
            fixed (byte* packet = &data[0])
            {
                return *(GenericPacket*)packet;
            }
        }
    }
}

但是每次都必须调用一个方法来转换它有点烦人:(有人还有更多建议吗?

谢谢,JD

最佳答案

您只想将数组的前两个字节转换为短字节,这会如何造成性能问题?

packetid = ((short)data[0]  << 8) | data[1];

如果您想要另一种字节顺序,则反之亦然。

编辑:

所以你想解析多个字段。那么就不要重新发明轮子了。使用 Google 的 Protocol Buffers,它非常快速且高效,我怀疑您会遇到性能问题。这是 .NET port.

关于c# - StructLayout 将字节数组转换为短数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11390645/

相关文章:

javascript - js - 如何将表数据转换为树 (JSON)

c# - 如何在 C# 中将固定字节/char[100] 转换为托管 char[]?

c# - 结构中指针字段的大小

c++ - 怎么能不对 C++ 结构布局做出假设呢?

c# - 如何获取 User-Agent header 以使用 C# 访问 GitHub API

java - 为什么这个 PBKDF2 函数每次都会输出不同的哈希值

c# - 如何在 Visual Studio 2019 中向我的 C# 程序添加 list 文件?

javascript - 数组推送第一次不起作用

c# - 使用 IP 地址打印到网络打印机

c# - Entity Framework 以及类似的地方