【问题标题】:How to convert byte array to any type如何将字节数组转换为任何类型
【发布时间】:2016-01-06 11:32:54
【问题描述】:

好的,伙计们,我看到有人询问如何将字节数组转换为intstringStream 等......答案各不相同,我个人没有找到任何答案满意的答案。

所以这里有一些我们想要将字节数组转换为的类型。

UnityEngine.Font 可以接收ttf 的数据。

UnityEngine.Testure2D可以从.png.jpg等图像文件中获取数据...

我们如何将字节数组转换为StringUnityEngine.Testure2D,UnityEngine.FontBitmap 等...

填充字节数组的数据必须来自文件类型,其数据可以由我们想要将字节数组转换为的类型管理?

目前可以吗?

任何帮助将不胜感激。

【问题讨论】:

  • 字节数组就是这样。它是一系列字节。无法知道这些字节是否属于字符串、int、UnityEngine.Font 等。它们只是字节。您必须通过传入 Type 参数来“反序列化”字节,这样它就会知道它是什么类型的对象。
  • 太棒了。你能举个简单的例子吗?
  • 永远不要将字节数组转换为字符串,除非它是字符串。真的可以搞砸代码。 Chrs/Strings 是 Net 中的两个字节对象,您必须小心使用正确的编码。发送/接收数据通常是通过发送一个字节数组来完成的。任何对象都必须被序列化(意味着转换为字节)然后反序列化。 .png 和 jpg 等二进制数据是单字节数组对象,可以简单地转换为字节数组。复杂对象在序列化之前需要更好地定义字段大小,以便它们可以正确反序列化。这就是为什么您会看到不同的答案。
  • 非常感谢您的信息和建议

标签: c# arrays byte


【解决方案1】:

原始类型很容易,因为它们具有定义为字节数组的表示形式。其他对象不是因为它们可能包含无法持久化的东西,例如文件句柄、对其他对象的引用等。

您可以尝试使用BinaryFormatter 将对象持久化到字节数组中:

public byte[] ToByteArray<T>(T obj)
{
    if(obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    using(MemoryStream ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

public T FromByteArray<T>(byte[] data)
{
    if(data == null)
         return default(T);
    BinaryFormatter bf = new BinaryFormatter();
    using(MemoryStream ms = new MemoryStream(data))
    {
        object obj = bf.Deserialize(ms);
        return (T)obj;
    }
}

但并非所有类型都是可序列化的。例如,无法“存储”与数据库的连接。您可以存储用于创建连接的信息(如连接字符串),但不能存储实际的连接对象。

【讨论】:

  • 我真的很喜欢你的回答,我正在这里测试。我收到一个错误。这是我的代码和 .我指出错误是什么以及在哪里。 :)
  • 我的代码中的错误在这里Byte[] ba = ToByteArray(myStream); //SerializationException: Type System.IO.UnmanagedMemoryStream is not marked as Serializable.
  • 如果它不能序列化,那么你就不能序列化它。无论如何,您希望对序列化的 stream 做什么。它只是一种移动数据的机制;它本身没有任何数据。
  • 现在BinaryFormatter 已过时且不安全,请阅读:CA2300: Do not use insecure deserializer BinaryFormatter & BinaryFormatter security guide
【解决方案2】:

您可以在.Net 6 中将字节数组反序列化为这样的类对象。

using System.Text.Json;

using MemoryStream ms = new MemoryStream(bytes);
Examlple ex = JsonSerializer.Deserialize<Example>(ms);
Console.WriteLine(ex.Value);

class Example
{
    string Value {get; set; }
}

【讨论】:

    【解决方案3】:

    c++模板版本:

    template<typename T>
    void fromByteArray(T& t, byte *bytes)
    {
      t = *(T*)bytes;
    };
    
    template<typename T>
    byte * toByteArray(T& t) 
    {
      return (byte*)&t;
    };
    

    【讨论】:

    • 问题用c#标记
    • 我可以在 c# dll 中使用 c++ dll
    猜你喜欢
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多