none
バイナリデータの置換について RRS feed

  • 質問

  • こんにちは VB6は今まで使っていましたがVB.NET2003は本格的に使い始めて
    まだまもない者です

    JISコードでかかれているファイルがありまして、
    そのファイルの中に固定長の項目があり、内訳として全角文字項目があります。
    実際の全角文字の前後にそれぞれには固有の文字コード(制御文字)が
    ついています。たとえば以下のような感じです。
    (***は制御文字を示していますが、実際のものとは異なります)

    ***名古屋市 中区 上前津9丁目***777-7777

    フィールドに50バイトの領域があってもその中もデータに全角文字が入る
    都度、制御文字が入っています。前のコードと後のコードは当然セットで
    ついていますが・・・。
    これらを外したい(正確にはスペースなどに置き換えたい)のですが、
    StreamReaderクラスで読み込ませると制御文字が外れてしまうので
    実質可変長になってしまい、その後の処理に影響が出てしまうので、
    FileStreamクラスでバイナリで読み込んで文字コードを置き換えようと
    しているのですが、適切に書き込まれませんでした。

    概ね下記のようなコードでやっています。おかしな点や、
    VB.NET2003でほかにいいやり方などがあれば教えてください。


    '読込みファイルをオープンする
    objREADER = New FileStream("C:\AAA.TXT", FileMode.Open, FileAccess.Read)
    objR_BIN = New BinaryReader(objREADER)
    '内部バッファを文字列数分拡張する
    ReDim intInternal(CInt(objREADER.length) - 1)
    objR_BIN.Read(Internal, 0, CInt(objREADER.Length))
    strREAD = System.BitConverter.ToString(intInternal)

    (ここで編集)

    '書き込み
    objWRITER = New FileStream("c:\bbb.txt", FileMode.Create)
    objW_BIN = New BinaryWriter(objWRITER)
    ReDim absInternal(CInt(strREAD.Length) - 1)
    bytInternal = System.Text.Encoding.GetEncoding(strCharCode).GetBytes(strREAD)
    objW_BIN.Write(bytInternal, 0, CInt(UBound(bytInternal)))

    (ここでファイルクローズ)

    2006年7月29日 9:13

すべての返信

  • えーと、そもそもそのエスケープシーケンスを殺しちゃうと元のマルチバイト文字に復元不可能になると言う点は大丈夫ですか。

    さて、お書きのコードですが、BitConverter.ToString で文字列化してますよね。このときどういう文字列になってるかはまあ既にお調べかと思います。で、それを書き込む時にそのまま Encoding.GetBytes してますよね。このメソッドは、渡された文字列をそのまま忠実にバイト配列に変換します。01-23 という文字列は (JIS とかなら) { &H30, &H31, &H2D, &H32, &H33 } です。恐らくこれはお望みのバイト配列ではないでしょう。

    01-23 と言う文字列を { &H01, &H23 } にするには、文字列を分割してそれぞれ数値に変換という手順になるかな。文字列型 String や バイト型 Byte 、あるいは変換のためのクラス Convert を MSDN で調べてみてください。使いでのあるメソッドがあるでしょう。

    // あるいは BitConverter を使わず自前で Byte 配列を解析するか。

    2006年7月29日 9:41
  • こんにちは 

    VB6のときにも同様のことをやっていました。
    ただ1文字ずつ分割して解析して・・・・とやってました。
    .NETFrameWorkなら一括でできるのかなとちょっとだけ期待してました。
    ”甘い!”と突込みがきそうですけど。。。

    とりあえずVB6のときのソース引っ張り出して同じ事をやるようにします。

    2006年7月31日 10:02