在 C# 中将十进制数组转换为字节数组,反之亦然
Converting decimal array to byte array and vice-versa in C#
我有以下函数可以将原始数组类型转换为字节数组,这样我就可以将它转换为 base64 字符串,然后将它存储在某个地方,反之亦然,我现在被卡住了,因为我必须转换十进制类型不是原始类型。我意识到十进制基本上是一个结构,所以我会将结构数组转换为字节数组,但我只看到使用不安全代码的答案,我想尽可能避免这种情况。我使用 Unity,但也仅限于 .NET 2.0
private static string ConvertArrayToBase64<T>(ICollection<T> array) where T : struct
{
if (!typeof(T).IsPrimitive)
throw new InvalidOperationException("Only primitive types are supported.");
int size = Marshal.SizeOf(typeof(T));
var byteArray = new byte[array.Count * size];
Buffer.BlockCopy(array.ToArray(), 0, byteArray, 0, byteArray.Length);
return Convert.ToBase64String(byteArray);
}
private static T[] ConvertBase64ToArray<T>(string base64String) where T : struct
{
if (!typeof(T).IsPrimitive)
throw new InvalidOperationException("Only primitive types are supported.");
var byteArray = Convert.FromBase64String(base64String);
var array = new T[byteArray.Length / Marshal.SizeOf(typeof(T))];
Buffer.BlockCopy(byteArray, 0, array, 0, byteArray.Length);
return array;
}
您应该考虑使用 System.IO.BinaryReader
和 System.IO.BinaryWriter
。这些将使您能够读取和写入基元 to/from 另一个流,例如 System.IO.MemoryStream
,然后您可以访问二进制数据并使用 Convert.ToBase64String()
将其转换为 base 64
您可以将几乎任何对象序列化和反序列化为字节,XML、JSON 等
static byte[] serialize<T>(T t)
{
var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
using (var ms = new MemoryStream())
{
serializer.Serialize(ms, t);
return ms.ToArray();
}
}
static object deserialize(byte[] bytes)
{
var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
using (var ms = new MemoryStream(bytes))
return serializer.Deserialize(ms);
}
[Serializable] class arrays { public decimal[] decArray; public int[] intArray; }
示例使用
arrays a = new arrays();
a.decArray = new decimal[] { 1m, 2m };
a.intArray = new int[] { 3, 4 };
byte[] bytes = serialize(a);
arrays result = deserialize(bytes) as arrays;
Debug.Print($"{string.Join(", ", result.decArray)}\t{string.Join(", ", result.intArray)}");
我有以下函数可以将原始数组类型转换为字节数组,这样我就可以将它转换为 base64 字符串,然后将它存储在某个地方,反之亦然,我现在被卡住了,因为我必须转换十进制类型不是原始类型。我意识到十进制基本上是一个结构,所以我会将结构数组转换为字节数组,但我只看到使用不安全代码的答案,我想尽可能避免这种情况。我使用 Unity,但也仅限于 .NET 2.0
private static string ConvertArrayToBase64<T>(ICollection<T> array) where T : struct
{
if (!typeof(T).IsPrimitive)
throw new InvalidOperationException("Only primitive types are supported.");
int size = Marshal.SizeOf(typeof(T));
var byteArray = new byte[array.Count * size];
Buffer.BlockCopy(array.ToArray(), 0, byteArray, 0, byteArray.Length);
return Convert.ToBase64String(byteArray);
}
private static T[] ConvertBase64ToArray<T>(string base64String) where T : struct
{
if (!typeof(T).IsPrimitive)
throw new InvalidOperationException("Only primitive types are supported.");
var byteArray = Convert.FromBase64String(base64String);
var array = new T[byteArray.Length / Marshal.SizeOf(typeof(T))];
Buffer.BlockCopy(byteArray, 0, array, 0, byteArray.Length);
return array;
}
您应该考虑使用 System.IO.BinaryReader
和 System.IO.BinaryWriter
。这些将使您能够读取和写入基元 to/from 另一个流,例如 System.IO.MemoryStream
,然后您可以访问二进制数据并使用 Convert.ToBase64String()
您可以将几乎任何对象序列化和反序列化为字节,XML、JSON 等
static byte[] serialize<T>(T t)
{
var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
using (var ms = new MemoryStream())
{
serializer.Serialize(ms, t);
return ms.ToArray();
}
}
static object deserialize(byte[] bytes)
{
var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
using (var ms = new MemoryStream(bytes))
return serializer.Deserialize(ms);
}
[Serializable] class arrays { public decimal[] decArray; public int[] intArray; }
示例使用
arrays a = new arrays();
a.decArray = new decimal[] { 1m, 2m };
a.intArray = new int[] { 3, 4 };
byte[] bytes = serialize(a);
arrays result = deserialize(bytes) as arrays;
Debug.Print($"{string.Join(", ", result.decArray)}\t{string.Join(", ", result.intArray)}");