把字符串带到一个字节[]

时间:2010-04-19 19:30:15

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

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

0x89504E470D0A1A0A0000000D49484452000000F00000014008020000000D8A66040....
<truncated for brevity>

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

6 个答案:

答案 0 :(得分:3)

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;
    }
}

答案 1 :(得分: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(); 
} 

答案 2 :(得分:2)

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

如果是这样,你可以这样做:(首先删除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);

(测试)

答案 3 :(得分:1)

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

列数据类型是什么? VARBINARY?

答案 4 :(得分:1)

.NET中的

String表示“文本” - 字节数组存在根本区别,不存在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);

答案 5 :(得分:0)

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