固定对象到字节数组

SF开发人员

我有一个看起来像这样的简单对象:

public class Foo
{
   public UInt32 One { get; set; }
   public UInt32 Two { get; set; }
   public UInt32 Three { get; set; }
   public UInt32 Four { get; set; }
}

我尝试了在网上某处找到的以下代码:

public byte[] ObjectToByteArray(Object obj)
{
    MemoryStream fs = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(fs, obj);
    byte[] rval = fs.ToArray();
    fs.Close();
    return rval;
}

但是以某种方式返回的字节数组的大小为248个字节。
我希望它是4个字节x 4个字段= 16个字节。

问题
将固定对象转换为字节数组的最干净方法是什么?
在这种情况下,结果数组的大小应为16个字节吗?

阿托莫斯克

BinaryFormatter保存了大量类型信息以能够正确反序列化。如果要紧凑的序列化或通过某种严格的协议进行通信,则必须像下面这样显式地进行:

public byte[] ToByteArray()
{
    List<byte> result = new List<byte>();

    result.AddRange(BitConverter.GetBytes(One));
    result.AddRange(BitConverter.GetBytes(Two));
    result.AddRange(BitConverter.GetBytes(Three));
    result.AddRange(BitConverter.GetBytes(Four));

    return result.ToArray();
}

在这里,我将每个UInt32转换为字节数组,并将其存储在结果数组中。

编辑
事实证明,还有另一种使用的方法structMarshal首先struct使用以下属性进行制作和标记:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
    public string StringField;

    public int IntField;
}

此处LayoutKind.Sequential告诉clr以与声明相同的顺序将字段保留在内存中。没有Pack = 1结构会占用比所需更多的内存。就像struct一个short字段一样,一个字段byte仅需要3个字节,但是默认情况下,它的大小很可能是4(处理器具有用于处理单个字节,2个字节和4个字节的指令,clr为每个struct实例牺牲一个字节以减少指令的数量)机器代码的一半)。现在您可以Marshal用来复制字节:

public static byte[] GetBytes<T>(T str)
{
    int size = Marshal.SizeOf(str);
    var bytes = new byte[size];
    IntPtr ptr = Marshal.AllocHGlobal(size);

    try 
    {
         Marshal.StructureToPtr(str, ptr, true);
         Marshal.Copy(ptr, bytes, 0, size);
         return bytes;
    }
    finally 
    {
         Marshal.FreeHGlobal(ptr);
    }
}

使用简单类型,一切都可以正常工作。对于复杂的类型,例如,string您必须使用MarshalAsattribute,并且使用它要复杂一些(例如,我告诉clr将字符串编组为固定的50个字节大小的数组)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可观察字节数组到对象的转换

来自分类Dev

字节数组到布尔数组

来自分类Dev

Clojure,文件到字节数组?

来自分类Dev

WPF WriteableBitmap到字节数组

来自分类Dev

BigIntegers的ArrayList到字节数组

来自分类Dev

图像到字节数组-ExternalException

来自分类Dev

字节数组到BitmapImage WP

来自分类Dev

编码图像到字节数组

来自分类Dev

图片框到字节数组

来自分类Dev

ZipEntry到字节数组

来自分类Dev

AS3字节数组到C#字节数组

来自分类Dev

AS3字节数组到C#字节数组

来自分类Dev

MySQL和Java:检索到的字节数组与存储时的字节数组不同

来自分类Dev

字节字符串到字节数组

来自分类Dev

字节数组[]到字节在Java中可能吗?

来自分类Dev

字节数组到字节的转换错误

来自分类Dev

字节数组[]到字节在Java中可能吗?

来自分类Dev

读取文件到字节数组时的冗余字节

来自分类Dev

访问二维固定字节数组

来自分类Dev

压缩私钥以适应固定大小的字节数组

来自分类Dev

字节数组到文件对象而不保存到磁盘

来自分类Dev

POJO到字节数组与POJO到JSON

来自分类Dev

ARGB int数组到CMYKA字节数组的转换

来自分类Dev

C#用户输入到字节数组

来自分类Dev

将字节数组覆盖到CGImage

来自分类Dev

字节数组到int C#

来自分类Dev

字节数组到十进制Java

来自分类Dev

Delphi-字节数组到字符串

来自分类Dev

Python字符串到字节数组并返回