2009-02-12 101 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); 
}