1

はい、約 5 時間解決策を読みましたが、どれも機能しません。BitConverter は空白文字列を作成するだけです。

基本的に私がやっていることは、16 進数を介してレベルの内容を読み取り、最終的にツリービューに表示するレベル リーダーを作成しようとしていることです。最初にやらなければならないことは、データを編集できるバイト配列を作成することです。しかし、今はデータを画面に表示したいと思っています。私の知る限り、バイト配列を画面に表示することはできません。最初に文字列に変換する必要があります。

それが私がやろうとしていることです:

        using (OpenFileDialog fileDialog = new OpenFileDialog())
        {
            if (fileDialog.ShowDialog() != DialogResult.Cancel)
            {
                textBox1.Text = fileDialog.FileName;
                using (BinaryReader fileBytes = new BinaryReader(new MemoryStream(File.ReadAllBytes(textBox1.Text))))
                {
                    string s = null;
                    int length = (int)fileBytes.BaseStream.Length;
                    byte[] hex = fileBytes.ReadBytes(length);
                    File.WriteAllBytes(@"c:\temp_file.txt", hex);
                }
            }
        }
    }

注:私が試みたものは何も機能しなかったため、変換の試みを削除しました。このデータを使用して文字列に変換し、テキストボックスに追加する方法を知っている人はいますか? (もちろん、後者の方法は知っています。私が苦労しているのは前者です。)もしそうなら、例を挙げてください。

私はおそらく自分自身をもっと明確にするべきでした。バイトを対応する文字に変換したくありません (つまり、0x43 の場合、「C」を出力したくありません。「43」を出力したいのです。

4

4 に答える 4

3

データを Hex に変換できます。

  StringBuilder hex = new StringBuilder(theArray.Length * 2);
  foreach (byte b in theArray)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();
于 2012-09-11T08:24:01.210 に答える
2

バイト配列がどのエンコーディングで格納されているか知っていますか?

Encoding.GetStringメソッドが必要です

これがMSDNの例です

using System;
using System.IO;
using System.Text;

public class Example
{
   const int MAX_BUFFER_SIZE = 2048;
   static Encoding enc8 = Encoding.UTF8;

   public static void Main()
   {
      FileStream fStream = new FileStream(@".\Utf8Example.txt", FileMode.Open);
      string contents = null;

      // If file size is small, read in a single operation. 
      if (fStream.Length <= MAX_BUFFER_SIZE) {
         Byte[] bytes = new Byte[fStream.Length];
         fStream.Read(bytes, 0, bytes.Length);
         contents = enc8.GetString(bytes);
      }
      // If file size exceeds buffer size, perform multiple reads. 
      else {
         contents = ReadFromBuffer(fStream);
      }
      fStream.Close();
      Console.WriteLine(contents);
   }

   private static string ReadFromBuffer(FileStream fStream)
   {
        Byte[] bytes = new Byte[MAX_BUFFER_SIZE];
        string output = String.Empty;
        Decoder decoder8 = enc8.GetDecoder();

        while (fStream.Position < fStream.Length) {
           int nBytes = fStream.Read(bytes, 0, bytes.Length);
           int nChars = decoder8.GetCharCount(bytes, 0, nBytes);
           char[] chars = new char[nChars];
           nChars = decoder8.GetChars(bytes, 0, nBytes, chars, 0);
           output += new String(chars, 0, nChars);                                                     
        }
        return output;
    }
}
// The example displays the following output: 
//     This is a UTF-8-encoded file that contains primarily Latin text, although it 
//     does list the first twelve letters of the Russian (Cyrillic) alphabet: 
//      
//     А б в г д е ё ж з и й к 
//      
//     The goal is to save this file, then open and decode it as a binary stream.

編集

バイト配列を 16 進形式で出力したい場合、BitConverterはあなたが探しているものです。ここにMSDNの例があります

// Example of the BitConverter.ToString( byte[ ] ) method. 
using System;

class BytesToStringDemo
{
    // Display a byte array with a name. 
    public static void WriteByteArray( byte[ ] bytes, string name )
    {
        const string underLine = "--------------------------------";

        Console.WriteLine( name );
        Console.WriteLine( underLine.Substring( 0, 
            Math.Min( name.Length, underLine.Length ) ) );
        Console.WriteLine( BitConverter.ToString( bytes ) );
        Console.WriteLine( );
    }

    public static void Main( )
    {
        byte[ ] arrayOne = {
             0,   1,   2,   4,   8,  16,  32,  64, 128, 255 };

        byte[ ] arrayTwo = {
            32,   0,   0,  42,   0,  65,   0, 125,   0, 197,
             0, 168,   3,  41,   4, 172,  32 };

        byte[ ] arrayThree = {
            15,   0,   0, 128,  16,  39, 240, 216, 241, 255, 
           127 };

        byte[ ] arrayFour = {
            15,   0,   0,   0,   0,  16,   0, 255,   3,   0, 
             0, 202, 154,  59, 255, 255, 255, 255, 127 };

        Console.WriteLine( "This example of the " +
            "BitConverter.ToString( byte[ ] ) \n" +
            "method generates the following output.\n" );

        WriteByteArray( arrayOne, "arrayOne" );
        WriteByteArray( arrayTwo, "arrayTwo" );
        WriteByteArray( arrayThree, "arrayThree" );
        WriteByteArray( arrayFour, "arrayFour" );
    }
}

/*
This example of the BitConverter.ToString( byte[ ] )
method generates the following output.

arrayOne
--------
00-01-02-04-08-10-20-40-80-FF

arrayTwo
--------
20-00-00-2A-00-41-00-7D-00-C5-00-A8-03-29-04-AC-20

arrayThree
----------
0F-00-00-80-10-27-F0-D8-F1-FF-7F

arrayFour
---------
0F-00-00-00-00-10-00-FF-03-00-00-CA-9A-3B-FF-FF-FF-FF-7F
*/
于 2012-09-11T08:21:26.357 に答える
1

まず、バイトを UTF8 などのより便利なものに変換するだけで、そこから文字列を取得できます。次のようなもの (私の場合: iso-8859-1):

buf = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buf);
tempString = Encoding.UTF8.GetString(buf, 0, count);
于 2012-09-11T08:20:57.010 に答える
1

ランダムなバイト シーケンスを表示するデフォルトの方法は実際にはありません。オプション:

  • base64 エンコード (Convert.ToBase64String) - 読み取り不能ですが、少なくとも安全に印刷可能な文字列を生成します
  • 各バイトを HEX エンコードし、各バイトの表現の間にスペースを入れて連結します。行ごとに数 (つまり 16) バイトのグループに分割される可能性があります。- よりハッカーのようなビューが生成されます。
  • すべてのバイトを印刷可能な文字 (潜在的に色付き) にマップし、場合によっては複数の行に分割します - データのマトリックスのようなビューを生成します...
于 2012-09-11T08:26:04.203 に答える