none
バイナリデータ関連、データの長さについて RRS feed

  • 質問

  • いつもお世話になっています。

    バイナリデータの保存について質問したものです。

    ”あいうえお”をEucのバイナリに変換するとA4-A2-A4-A4-A4-A6-A4-A8-A4-AAのようになります。

    変換されたA4-A2-A4-A4-A4-A6-A4-A8-A4-AAをtest.binというファイルに保存をしているのですが、

    問題はA4-A2-A4-A4-A4-A6-A4-A8-A4-AAの長さを測って一番前につけたいと思います。

      protected System.Web.UI.WebControls.Button Button1;
      protected System.Web.UI.WebControls.TextBox TextBox1;
      byte[] bytes;

      private void Page_Load(object sender, System.EventArgs e)
      {
       string str = "あいうえお";

       Encoding sjisEnc = Encoding.GetEncoding("euc-jp");
       bytes = sjisEnc.GetBytes(str);
       TextBox1.Text = BitConverter.ToString(bytes);
       // 出力:A4-A2-A4-A4-A4-A6-A4-A8-A4-AA
      }

    バイナリエディタでデータを確認するとちゃんとデータが入っていました。

    エディタ上で長さを測ってみたら、0xA(10)bytesだというのがわかりましたが、

    ASP.NETを使って0A-A4-A2-A4-A4-A4-A6-A4-A8-A4-AAのデータの一番前に

    このように0xA(10)bytesの0Aをつけてtest.binというファイルとして保存したいのです。

    アドバイスの方をお願い致します。

    2006年5月17日 4:08

すべての返信

  • いつもお世話になっています。

    データの長さは  

    protected System.Web.UI.WebControls.TextBox TextBox1;
      protected System.Web.UI.WebControls.Button Button1;
      protected System.Web.UI.WebControls.TextBox TextBox2;

      byte[] bytes;
      byte[] bytes1;
      int Byte_Count;
      private void Page_Load(object sender, System.EventArgs e)
      {

       string str = "あいうえお"; 
       Encoding sjisEnc = Encoding.GetEncoding("euc-jp");
       bytes = sjisEnc.GetBytes(str);
       
       Encoding sjisEnc1 = Encoding.GetEncoding("euc-jp");
       Byte_Count = sjisEnc1.GetByteCount(str);
       bytes1 = BitConverter.GetBytes(Byte_Count);
       
       TextBox1.Text =BitConverter.ToString(bytes);// 出力:A4-A2-A4-A4-A4-A6-A4-A8-A4-AA
       TextBox2.Text =BitConverter.ToString(bytes1);// 出力:0A-00-00-00
      }

      private void Button1_Click(object sender, System.EventArgs e)
      {
       FileStream fs = new FileStream(@"e:\bsdata\testhong.bin",FileMode.OpenOrCreate);
       fs.SetLength(0);
       BinaryWriter w = new BinaryWriter(fs);
       w.BaseStream.Seek(0,SeekOrigin.Begin);

       w.Write(bytes+bytes1);★二つのByte型のデータをつないで『0A-A4-A2-A4-A4-A4-A6-A4-A8-A4-AA』のようにtest.binファイルに保存したいのです。
       w.Close();
       fs.Close();
      }

    どなたか教えていただけないでしょうか?よろしくお願いいたします。

    2006年5月17日 6:50
  • 0A-00-00-00の値が理解できませんでした。

    0Aだけなら0A-A4-A2-A4-A4-A4-A6-A4-A8-A4-AAのように保存できますが、

    0A-00-00-00-A4-A2-A4-A4-A4-A6-A4-A8-A4-AAのようにしかできません。

    byte型の0A-00-00-00から00-00-00を取り除く方法ってありますか?

    アドバイスの方をお待ちしています。よろしくお願いします。

    2006年5月17日 8:05
  • iMDPさん

    Bytes_Count 変数が Integer(INT32) だからじゃないですか?
    文字の長さが、128文字(Unicodeの場合)まででよければ、
    この変数を Byte 型にすれば
    GetByte しても余分な00はつかなくなると思います。

    2006年5月17日 8:37
  • 返信ありがとうございます。Bytes_Count 変数をByte型にすると

    Byte_Count = sjisEnc1.GetByteCount(str);でint型をbyteに暗黙的に変換できませんというメッセージが出ています。

     

    2006年5月17日 8:50
  • UNICODEで128文字まででよければ、

    明示的にキャストすればエラーは出なくなると思います。

    2006年5月17日 9:09
  • 返信ありがとうございます。少し結果の変更がありました。

    int Byte_Count;

    Byte_Count = sjisEnc1.GetByteCount(str);

    byte a = (byte)Byte_Count;

    bytes1 = BitConverter.GetBytes(a);

    でやってみたら、0A-00 までが表示できるようになりました。

    2006年5月17日 9:23
  • Byte配列に入れる前に、GetBytes を掛ける必要がないのでは?
    元々Byte型なので。
    2006年5月17日 12:06
  • お返事ありがとうございました。

    Puzzlerjp様のご返答がよくわかりませんでした。

    すみませんが、もう少しわかりやすくご指導していただけないでしょうか?

    よろしくお願いいたします。

    2006年5月18日 1:44
  • byte bytes_count ; ではなく、
    byte[] bytes_count = new byte[1] ;
    として、 bytes_count[0] = (byte) GetBytes ;
    すれば、 byte配列として サイズのみがとれるのではないかと思います。

    普段C#は使わないので、Byte配列に対する +演算子がどこに存在するのか
    わかりませんでしたが・・・
    バイト配列に対する+演算子が使えるのであれば、これでOKだと思います。

    2006年5月18日 6:44
  • って、件名からすると、Byte配列の連結もできていないのでしょうか?
    だとすると、 Bytes_Count を配列にする必要もないですね。
    参考にしてください。

                byte a ;
                byte[] b, c;

                a = 10; //(byte) GetBytes
                Encoding enc = Encoding.GetEncoding("euc-jp");
                b = enc.GetBytes("あいうえお");

                c = new byte[b.GetLength(0) + 1] ;
                c[0] = a ;
                for (int i = 0; i < b.GetLength(0) ; i++)
                {
                    c[i+1] = b[ i ];
                }
                MessageBox.Show(BitConverter.ToString(c));

    2006年5月18日 7:31
  • Puzzlerjp 様、ご丁寧なアドバイス、本当にありがとうございます。

    アドバイスを参考に応用してみたいと思っています。

    ありがとうございます。

    2006年5月18日 8:43