【问题标题】:C# convert string into its byte[] equivalentC# 将字符串转换为其等效的 byte[]
【发布时间】:2010-10-07 06:21:54
【问题描述】:

此时大多数人会想“啊,我发这个……”

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 是 ?.

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

谢谢, 迈克尔

【问题讨论】:

    标签: c# string encoding hex byte


    【解决方案1】:

    问题在于您的开始方法:

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

    ...

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

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

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

    【讨论】:

    • 我了解文件位字节和所有这些 shizzle 是如何工作的,这就是为什么我能够理解将 64 位整数存储(例如)为 8 字节的原因,我只是不知道如何获取信息: );感谢您的帮助
    • 但如果文件不包含文本,则将其视为包含文本的文件是一个根本性的误解,它会烧毁 所以 很多人。每当您开始考虑“将字符串的内容作为没有编码的字节”时,这几乎肯定意味着潜伏着一个错误。
    • 在这种情况下,我没有将“字符串”作为文本查看,我只是试图获取纯二进制文件,因为这就是文件存储的内容。不过我明白你的意思,谢谢:)
    • 抱歉唠叨 - 我知道这听起来很傲慢。感谢您的理解:)
    【解决方案2】:

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

    然后使用这个:

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

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

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

    【讨论】:

      【解决方案3】:

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

      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);
      }
      

      【讨论】:

        【解决方案4】:

        使用BinaryReader

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            如果需要字节,请使用 Stream!

            你到底为什么要搞乱 TextReader?

            编辑:

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

            【讨论】:

            • 嘿,我真的是 C# 新手,刚刚找到了一个读取文件的示例,这就是我拼凑起来的:P。不知道文件可以以任何其他方式读取:)
            猜你喜欢
            • 2010-11-08
            • 1970-01-01
            • 1970-01-01
            • 2011-07-05
            • 1970-01-01
            • 2015-09-30
            • 2013-01-17
            • 2015-09-04
            • 1970-01-01
            相关资源
            最近更新 更多