尝试创建一个将对象转换为字节数组的函数(没有创建之类的开销/元数据BinaryFormatter
)。我认为我对以下代码很满意,除了它能够将 UInt32[] 数组和 Int32[] 数组转换为字节数组的能力。
private byte[] ObjectToByteArray(object obj)
{
string dataType = obj.GetType().Name;
switch (dataType)
{
case "Byte[]": // an array of bytes
return (byte[])obj;
case "String": // a null-terminated ASCII string
return Encoding.ASCII.GetBytes((string)obj);
case "UInt16": // an array of unsigned short (16-bit) integers
return BitConverter.GetBytes((ushort)obj);
case "UInt32": // an array of unsigned long (32-bit) integers
return BitConverter.GetBytes((uint)obj);
case "UInt32[]": // an array of pairs of unsigned long (32-bit) integers
//return BitConverter.GetBytes((ushort)obj);
return null;
case "Int32": // an array of signed long (32-bit) integers
return BitConverter.GetBytes((int)obj);
case "Int32[]": // an array of pairs of signed long (32-bit) integers
//return BitConverter.GetBytes((int)obj);
return null;
default:
throw new Exception($"The type of value ({dataType}) is not supported.");
}
}
我原本想做一个简单的循环,每 4 个字节都重复,然后不断将它们添加到字节数组中,但不确定这是否可行,甚至不确定这是否是最好的方法。我甚至不确定我目前的方法是否是我已经完成的最佳方法。我在网络上找到的所有东西似乎都让我感到困惑,在处理转换数据类型时让我头晕目眩。
只需使用
Buffer.BlockCopy()
因为 Windows 是小端字节序(即最低有效字节在前),所以您将得到如下数组(当尝试打印所有元素时,以空格分隔):
1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0
另一种解决方案是使用跨度以小端方式获取字节数组:
注意返回数组的字节序。以 LittleEndian (windows) 序列化并以 BigEndian (linux/mac) 反序列化是不安全的,反之亦然。其派生词如哈希等也不安全。它仅供内存使用。
如果使用 手动迭代,则可以使其稳定
BinaryPrimitives
。它们在所有系统上默认为读/写 BigEndian。