7

在这一点上,大多数人会想“啊,我发这个……”

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 是一个?。

对不起,如果我看起来有点困惑:)

谢谢,迈克尔

4

6 回答 6

17

问题在于您的方法开始:

我需要没有编码的字节的确切值

...

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

这有点像看着一幅油画并说,“我想要那幅画的字节,没有编码。” 这没有意义。文本与二进制数据不同。一旦你明白了这一点,就很容易找到问题的根源。您真正想要的是文件的内容作为字节数组。这很简单,因为文件是二进制数据!如果它不是真正的文本,你不应该首先将它作为文本阅读。幸运的是,.NET 使这变得非常容易:

byte[] fileC = File.ReadAllBytes(dialog.FileName);
于 2009-02-12T19:05:53.203 回答
13

但是..我遇到的问题是我需要字节的确切值,而无需编码,只需要每个字节的纯值。

然后使用这个:

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

它返回由 .NET 字符串内部存储的字节。

但这一切都是 codswallop:一个字符串总是链接到一个特定的编码,没有办法绕过它。例如,如果文件包含无效的 Unicode 代码序列(可能会发生)或通过规范化,上述操作将失败。既然你显然不想要一个string,就不要读一个。改为将文件作为二进制数据读取。

于 2009-02-12T19:02:25.253 回答
12

//将字符串转换为字节数组

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);
}
于 2012-05-07T09:36:35.217 回答
4

使用BinaryReader

于 2009-02-12T19:01:59.733 回答
3

为什么要从字符串转换?你不能直接把文件的内容读成字节吗?

byte[] fileC = File.ReadAllBytes(dialog.FileName);
于 2009-02-12T19:05:52.437 回答
1

如果您想要字节,请使用 Stream!

你到底为什么要搞乱TextReader?

编辑:

根据您的示例,您正在打开一个文件,因此只需使用 FileStream。

于 2009-02-12T19:05:44.747 回答