2009-02-12 157 views
6

此時大多數人都會想到「啊生病後這..:」C#轉換字符串轉換成它的字節[]等價

byte[] dataB= System.Text.Encoding.ASCII.GetBytes(data); 

但是..我有問題是我需要的精確值沒有編碼的字節只是每個字節的純值。例如,如果字符串的值是(0xFF32),我希望它也將其轉換爲{255,50}。他的理由是我有一個文件格式,我試圖讀取哪些存儲int作爲字節保存它們,然後在程序打開時讀取它們。

這是我到目前爲止有:

... 
dialog.InitialDirectory = 
    Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + 
    "/Test"; 

dialog.Title="Open File"; 

if (dialog.ShowDialog(this) == DialogResult.OK) 
{ 
    StreamReader reader = new StreamReader(dialog.FileName); 
    string data = reader.ReadToEnd(); 
    reader.Close(); 
    byte[] fileC = System.Text.Encoding.ASCII.GetBytes(data); 
    File_Read(dialog.FileName,fileC); 
} 
... 

所以當我嘗試讀取它轉換的文件修道院文件說0xFF的到0x3F的,因爲0xFF的是大於127和0x3F的是?

很抱歉,如果我似乎有點混亂:)

感謝, 邁克爾

回答

18

問題是與你的方法入手:

我需要的字節數的精確值,沒有編碼

...

例如,如果字符串的值是(0xFF32)

這有點像在看一幅油畫,說:「我想該照片的字節,沒有編碼。」這沒有意義。文本與二進制數據不一樣。一旦你明白了,就很容易找到問題的根源。你真正想要的是作爲字節數組的文件的內容。這很容易,因爲文件是二進制數據!如果它不是真正的文本,你不應該首先將它作爲文本閱讀。幸運的是,.NET使這很容易:

byte[] fileC = File.ReadAllBytes(dialog.FileName); 
+0

我明白如何文件位字節和所有shizzle工作,這就是爲什麼我能夠理解存儲(例如)一個64位整數爲8字節我只是不知道如何獲得在info :); thansk爲你的幫助 – redorkulated 2009-02-12 19:09:29

12

但是..我的問題是我需要字節的確切值,沒有編碼只是每個字節的純值。

然後用這個:

byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data); 

它返回由.NET字符串內部存儲的字節數。

但是,這一切都是codswallop:一個字符串是總是鏈接到一個特定的編碼,並沒有辦法繞過它。以上將失敗,例如如果該文件包含無效的Unicode代碼序列(可能發生)或通過規範化。既然你明顯不想 a string,不要讀一個。改爲將文件作爲二進制數據讀取。

1

如果您想要字節,請使用Stream!

爲什麼你在亂搞TextReader?

編輯:

按照您的例子,你打開一個文件,所以只需要使用一個FileStream。

+1

嘿,即時通訊真的是新的C#剛剛找到一個例子來閱讀文件,這就是我拼湊在一起:P。不知道文件可以讀取任何其他方式:) – redorkulated 2009-02-12 19:06:37

3

爲什麼要根據字符串轉換?難道你不能直接讀取文件的內容到字節?

byte[] fileC = File.ReadAllBytes(dialog.FileName); 
11

//字符串轉換爲字節數組

public static byte[] StrToByteArray(string str) 
{ 
    System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); 
    return encoding.GetBytes(str); 
} 

//轉換爲字節數組爲字符串

public string ByteArrayToStr(byte [] dBytes) 
{ 
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 
return enc.GetString(dBytes); 
}