none
バイナリファイルの読込 一定の法則で差が生じる RRS feed

  • 質問

  • あるシステムが出力するバイナリファイルを読み込んで、処理したいと考えています。

    バイナリファイルの中身は
    1バイト目 01
    2バイト目 02
    となっていて、2バイトをあわせて0102というコードになります。
    この形式でコードが100個ほどはいっています。

    作成したプログラムで読み込んでみた結果と、バイナリエディタ「Stirling.exe」での結果を確認してみると、差があるのですが、その理由がわかりません。
    出力しているシステムから確認してみると、どうやらバイナリエディタのほうが正しいようです。
    実際の値 :0111,0112,0113,0114,0115

    読込した値:0117,0118,0119,0120,0121

    実際の値 :2105,0000,2106,0000,0000

    読込した値:3305,0000,3306,0000,0000


    やり方が悪いのか?と考え、ネットにあった情報をもとに2種類、違う処理をしてみましたが、結果は同じでした。
    	Dim value As Byte() = My.Computer.FileSystem.ReadAllBytes("c:\ファイル名")
    For Each val As String In value
    Console.WriteLine(val)
    Next
    (別の方法①)<br/>
            Dim fs As New System.IO.FileStream("C:\ファイル名", System.IO.FileMode.Open, System.IO.FileAccess.Read)
    'ファイルを読み込むバイト型配列を作成する
    Dim bs(fs.Length - 1) As Byte
    'ファイルの内容をすべて読み込む
    fs.Read(bs, 0, bs.Length)
    fs.Close()
    (別の方法②)        <br/>
        Dim MyArray(50) As Byte
    Dim FileNum As Integer = FileSystem.FreeFile
    FileSystem.FileOpen(FileNum, "C:\ファイル名", OpenMode.Binary, OpenAccess.Read, OpenShare.LockWrite)
    FileSystem.FileGet(FileNum, MyArray, 1)
    FileSystem.FileClose(FileNum)
    原因がわからないまま、データを眺めていると、生じている差に法則があるようでした。

    元の値+(10の桁の値×6)

    というズレが生じているようです。

    1      1+(0*6)=1

    11    11+(1*6)=17

    21    21+(2*6)=33

    31    31+(3*6)=49

    41    41+(4*6)=65

    51    51+(5*6)=81

    61    61+(6*6)=97

    71    71+(7*6)=113

    81    81+(8*6)=129

    91    91+(9*6)=145


    バイナリのデータを処理したことがないので、基本的なことがなにかぬけているような気がしないでもないのですが、
    どうして、このような結果になるのかがわかりません。

    なにかわかることがあれば、教えてください。
    • 編集済み cis05 2010年2月9日 3:19 コードがぐちゃぐちゃになっていたので修正しました。
    2010年2月9日 3:12

回答

  • おのでらです。

    「Stirling.exe」で表示されている数値が16進数、プログラムで読み込んだデータが10進数で表示されているのではないかと思います。
    XNA 等の Tips を書いています。(http://sorceryforce.com)
    • 回答としてマーク cis05 2010年2月9日 5:00
    2010年2月9日 3:30

すべての返信

  • おのでらです。

    「Stirling.exe」で表示されている数値が16進数、プログラムで読み込んだデータが10進数で表示されているのではないかと思います。
    XNA 等の Tips を書いています。(http://sorceryforce.com)
    • 回答としてマーク cis05 2010年2月9日 5:00
    2010年2月9日 3:30
  • おのでらさん、返信ありがとうございます。

    ご指摘の通りでした。
    Convert.ToStringを使って、16進数に変換しました。

    10毎に6増える→16進数と気付けなかったのが無念です^^;

    ずっと前にも別の場所で、おのでらさんにレスつけてもらったり、たびたびお世話になっています。
    ありがとうございます!
    2010年2月9日 5:00