在这一点上,大多数人都会想到“啊病了这个......:”
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是?。
很抱歉,如果我有点困惑:)
谢谢, 迈克尔
答案 0 :(得分:17)
问题出在你的方法上:
我需要没有编码的字节的确切值
...
例如,如果字符串的值是(0xFF32)
这有点像看油画并说,“我想要那张图片的字节,没有编码。”这没有意义。文本与二进制数据不同。一旦理解了这一点,就很容易找到问题的根源。你真正想要的是文件的内容作为字节数组。这很简单,因为文件是二进制数据!如果它不是真正的文本,你不应该首先把它作为文本阅读。幸运的是,.NET使这很容易:
byte[] fileC = File.ReadAllBytes(dialog.FileName);
答案 1 :(得分:13)
然而..我遇到的问题是我需要字节的确切值,不需要编码每个字节的纯值。
然后使用:
byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data);
它返回.NET字符串内部存储的字节。
但所有这些都是codswallop:一个字符串始终链接到特定的编码,并且无法绕过它。以上将失败,例如如果文件包含无效的Unicode代码序列(可能发生)或通过规范化。由于您显然不想要一个string
,请不要阅读。请改为将文件读取为二进制数据。
答案 2 :(得分: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);
}
答案 3 :(得分:4)
使用BinaryReader。
答案 4 :(得分:3)
为什么要从字符串转换?难道你不能直接将文件内容读入字节吗?
byte[] fileC = File.ReadAllBytes(dialog.FileName);
答案 5 :(得分:1)
如果你想要字节,请使用Stream!
为什么你在乱用TextReader?
编辑:
根据您的示例,您正在打开文件,因此只需使用FileStream。