2010-04-19 221 views
0

我的数据库中有一个字符串表示图像。它看起来像这样:将字符串转换为字节[]

0x89504E470D0A1A0A0000000D49484452000000F00000014008020000000D8A66040.... 
<truncated for brevity> 

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

+0

您可以为 “从数据库加载” 代码? – Nayan 2010-04-19 19:33:24

+0

它通过linq-to-dataset加载我的应用程序。 (加载它的应用程序是一个Compact框架应用程序。)我测试了加载和保存到一个文件,所以我知道这是可行的。然后,我通过线路发送字节[]并将其存储在SQL Server 2008数据库中(通过linq-to-sql)。我不把它从2008年的数据库中拿出来。这样做的目标是找到一个简单的方法来验证图像是否正确地在数据库中。 – Vaccano 2010-04-19 19:42:20

+0

感谢所有的答案。我与linq版本一起去,因为我喜欢linq。每个想到我需要从十六进制到字节[]的人都从我这里得到了赞赏。再次感谢! – Vaccano 2010-04-19 19:46:55

回答

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

如果它有一个byte[],那么它是不是一个字符串。

什么是列数据类型? VARBINARY?

+0

它是varbinary [max]。但我正在接受SSMS所显示的内容并复制它。 (所以在这一点上它是一个字符串。)我想编写一个简单的工具,使我能够将该值插入到应用程序中,它会显示图像。 – Vaccano 2010-04-19 19:36:57

+1

然后你需要解析一个十六进制数字。看到我的答案。 – SLaks 2010-04-19 19:38:51

0

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

+0

我给了一个尝试,转换给了我一个字节[],但它没有工作,当我插入它:'MemoryStream stream = new MemoryStream(bytes); pictureBox1.Image =新的位图(流);' – Vaccano 2010-04-19 19:38:53

1

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

(测试)