【问题标题】:Take a string to a byte[]取一个字符串到一个字节[]
【发布时间】:2011-02-09 20:14:08
【问题描述】:

我的数据库中有一个代表图像的字符串。它看起来像这样:

0x89504E470D0A1A0A0000000D49484452000000F00000014008020000000D8A66040....
<truncated for brevity>

当我从数据库中加载它时,它以字节 [] 的形式出现。如何自己将字符串值转换为字节数组。 (我正在尝试删除一些测试代码的数据库。)

【问题讨论】:

  • 你能提供“从数据库加载”的代码吗?
  • 它由我的应用程序的 linq-to-dataset 加载。 (加载它的应用程序是一个紧凑的框架应用程序。)我测试了加载和保存到一个文件,所以我知道它有效。然后我通过网络发送 byte[] 并将其存储在 SQL Server 2008 db 中(通过 linq-to-sql)。我还没有把它从 2008 数据库中拉出来。这样做的目的是找到一种简单的方法来验证图像是否正确地存在于数据库中。
  • 感谢所有答案。我选择了 linq 版本,因为我喜欢 linq。每个认为我需要从 hex 到 byte[] 的人都得到了我的支持。再次感谢!

标签: c# .net .net-3.5 c#-3.0


【解决方案1】:
class Program
{
    static void Main()
    {
        byte[] bytes = StringToByteArray("89504E470D0A1A0A0000000D49484452000000");
    }

    public static byte[] StringToByteArray(string hex)
    {
        int length = hex.Length;
        byte[] bytes = new byte[length / 2];
        for (int i = 0; i < length; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }
}

【讨论】:

    【解决方案2】:

    听起来您在问如何将具有特定编码的字符串转换为字节数组。

    如果是这样,则取决于字符串的编码方式。例如,如果您有一个 base64 编码的字符串,那么您可以使用以下方法获得一个字节数组:

    asBytes = System.Text.Encoding.UTF8.GetBytes(someString);
    

    如果编码是十六进制(如您的示例中所示),则 BCL 中没有内置任何内容,但 you could use LINQ首先删除字符串头部的 0x ):

    public static byte[] StringToByteArray(string hex) { 
        return Enumerable.Range(0, hex.Length). 
            Where(x => 0 == x % 2). 
            Select(x => Convert.ToByte(hex.SubString(x,2), 16)). 
            ToArray(); 
    } 
    

    【讨论】:

      【解决方案3】:

      我相信您实际上是在尝试将 十六进制 数字转换为字节数组。

      如果是这样,您可以这样做:(先删除0x

      var bytes = new byte[str.Length / 2];
      for(int i = 0; i < str.Length; i += 2)
          bytes[i / 2] = Convert.ToByte(str.Substring(i, 2), 16);
      

      (已测试)

      【讨论】:

        【解决方案4】:

        如果它以byte[] 的形式出现,则它不是字符串。

        什么是列数据类型?变量二进制?

        【讨论】:

        • 它是 varbinary[max]。但我正在接受 SSMS 显示的内容并复制它。 (所以那时它是一个字符串。)我想编写一个简单的工具,允许我将该值插入应用程序,它会显示图像。
        • 然后你需要解析一个十六进制数。看我的回答。
        【解决方案5】:

        String 在 .NET 中的意思是“文本”——与字节数组有根本的区别,不存在 1:1 映射(就像其他复杂的 .NET 类型一样)。

        特别是,字符串以适当的字符编码编码。正如已经发布的那样,可以将给定的文本解码为所需的字节表示。在您的特定情况下,看起来好像您有一个单独的字节表示为填充的十六进制数字,即每个字节都是两个字符宽:

        int bytelength = (str.Length - 2) / 2;
        byte[] result = new byte[byteLength]; // Take care of leading "0x"
        for (int i = 0; i < byteLength; i++)
            result[i] = Convert.ToByte(str.Substring(i * 2 + 2, 2), 16);
        

        【讨论】:

          【解决方案6】:

          C# 中字符串到字节数组的转换
          http://www.chilkatsoft.com/faq/dotnetstrtobytes.html

          【讨论】:

          • 我试了一下,转换给了我一个字节[],但是当我把它插入这个时它不起作用:MemoryStream stream = new MemoryStream(bytes); pictureBox1.Image = new Bitmap(stream);
          猜你喜欢
          • 1970-01-01
          • 2012-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 2012-11-21
          • 2014-12-16
          • 2020-04-13
          相关资源
          最近更新 更多