我的数据库中有一个表,如下所示:
Id | Description | Icon
Icon
列的类型为varbinary(max)
我在这个表中有一行,Icon
列中的值显示在pastebin链接中(因为它是一个long值):
我正在尝试使用下面提到的here代码将此varbinary值转换为我的程序中的Image:
var binary = new System.Data.Linq.Binary(GetBytes(StreamText)).ToArray();
using (MemoryStream stream = new MemoryStream(binary))
{
var image = new System.Drawing.Bitmap(stream);
image.Save(DownloadPath, ImageFormat.Png);
}
private byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
其中StreamText
是pastebin链接中的字符串
但是在var image...
行,我一直得到例外。
参数无效
我做错了什么?
答案 0 :(得分:1)
问题是你的字符串是十六进制字符串,并且你试图将它转换为字节数组,就好像它是ascii字符串一样。您可以使用互联网上找到的任何方法将十六进制字符串转换为字节数组,如下所示:
static void Main(string[] args)
{
var s = "your long hex string";
if (s.StartsWith("0x"))
s = s.Remove(0, 2);
using (var stream = new MemoryStream(ConvertHexStringToByteArray(s)))
{
var image = new Bitmap(stream);
image.Save(DownloadPath, ImageFormat.Png);
}
}
public static byte[] ConvertHexStringToByteArray(string hexString) {
if (hexString.Length%2 != 0) {
throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));
}
byte[] HexAsBytes = new byte[hexString.Length/2];
for (int index = 0; index < HexAsBytes.Length; index++) {
string byteValue = hexString.Substring(index*2, 2);
HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
}
return HexAsBytes;
}