2010-04-19 275 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); 

(測試)