none
16進数:特定の範囲内かどうかをチェックする方法 RRS feed

  • 質問

  • 今までVB6でプログラム作成していたのでですが、VB2008に移行する事になり困っています。


    下記はファイル読込部分です。

    バイナリで全て読み込むのはVB6と同じです。

    Dim Bd As Byte() = New Byte() {}
    Dim Sr As System.IO.Stream = Nothing
    Dim Br As System.IO.BinaryReader = Nothing
    
    Sr = System.IO.File.Open("C:\aaa.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read)
    Br = New System.IO.BinaryReader(Sr)
    Bd = New Byte(Sr.Length - 1) {}
    Br.Read(Bd, 0, Bd.Length)
    Br.Close()
    


    下記は特定の範囲内かチェックする部分です。(VB6)

    For i = i To UBound(ByteData)
        If Flag Then
            Select Case ByteData(i)
                Case &HD
                    Exit For
    
                Case &H81 To &H9F, &HE0 To &HEA, &HF0 To &HF9
                    Flag = False
                    
                Case Else
                    Flag = True
            End Select
        
        Else
            Select Case CInt("&H" & Hex(ByteData(i - 1)) + Hex(ByteData(i)))
                Case &H8140 To &H84BE, _
                     &H8740 To &H879C, _
                     &H889F To &H9872, _
                     &H989F To &H9FFC, _
                     &HE040 To &HEAA4
                    Flag = True
                
                Case Else
                    Exit For
            End Select
        End If
    Next i
    

    これと全く同じ処理を作成したいのですが、どうすればよいでしょうか?


    宜しくお願い致します。

    2012年8月6日 6:33

回答

  • Option Strict が OFF なのかな?
    省略されていますが、実質的には Character = CInt("&H" & Hex(... と書いたのと同様の動きになります。
    .NET らしいコードで書くのであれば、BitConverter.ToInt16 を使うことかな。

    ところで、VB6 で Integer 型は 16 ビット符号付き整数型(-32768 ~ 32767)でしたが、VB.NET 以降では 32 ビット符号付き整数型に変わっています。
    今の代入、Select Case レベルなら実害はありませんが、ほかにもコードを移植されるのであればお気をつけください。

    • 回答としてマーク hana0101 2012年8月8日 4:03
    2012年8月7日 14:29
    モデレータ

すべての返信

  • とりあえず、VB 2008 でコードを書いてみましょう。

    その上でわからないことがあれば、例えば文字列を数値に変換するにはどうしたらよいかというようにもっと具体的に質問しましょう。(検索した方が早いですが)

    全くわからないなら参考書を読んで VB 2008 をよく勉強しましょう。


    2012年8月6日 7:24
  • これと全く同じ処理を作成したいのですが、どうすればよいでしょうか?

    念のため。

    処理している内容を自分で説明できますか?
    もし、説明できないというのであれば、ちゃんと VB6 の構文を押さえた上で実装の理解を優先してください。あるいは残された資料などから動きを理解してください。
    それがなされていないと、コードが提供されたとしてあなたの目的に合致しているか検証できません。

    また、フォーラムはお互いの助け合いで成り立つものであり、仕事を頼む場所でも、丸投げする場所でもありません。
    現状の内容(コードの説明が一切ない、コードの丸投げ)では、情報を得ることはかなわないかと思います。

    2012年8月6日 13:20
    モデレータ
  • galaco様、ありがとうございます。

    時間がなかった為、大変失礼な質問となってしまいました。

    申し訳ありませんでした。

    2012年8月7日 5:41
  • Azulean様、ありがとうございます。

    時間がなかった為、大変失礼な質問となってしまいました。

    申し訳ありません。

    念のため。

    処理している内容を自分で説明できますか?
    もし、説明できないというのであれば、ちゃんと VB6 の構文を押さえた上で実装の理解を優先してください。あるいは残された資料などから動きを理解してください。
    それがなされていないと、コードが提供されたとしてあなたの目的に合致しているか検証できません。

    また、フォーラムはお互いの助け合いで成り立つものであり、仕事を頼む場所でも、丸投げする場所でもありません。
    現状の内容(コードの説明が一切ない、コードの丸投げ)では、情報を得ることはかなわないかと思います。

    Azulean様の仰った事は十分わかっているつもりですが、今回の質問は丸投げしているようなものでした。

    本当に申し訳ありませんでした。


    今回の処理は下記の通りです。

    ・テキストファイルをバイナリで読込、1バイトずつコードをチェックする

    ・特定の範囲外の2バイト文字がきた場合はExitする


    試した結果、ほとんど同じコードで動く事がわかりました。


    ただ、↓の部分を

     Select Case CInt("&H" & Hex(ByteData(i - 1)) + Hex(ByteData(i)))

    ↓のようにしたのですが、この部分だけが不安です。

    Dim Character As Integer
    Character = "&H" & Hex(ByteData(i - 1)) & Hex(ByteData(i))
    Select Case Character

    動いているからこれで良いのか・・・。

    • 編集済み hana0101 2012年8月7日 5:59
    2012年8月7日 5:56
  • Option Strict が OFF なのかな?
    省略されていますが、実質的には Character = CInt("&H" & Hex(... と書いたのと同様の動きになります。
    .NET らしいコードで書くのであれば、BitConverter.ToInt16 を使うことかな。

    ところで、VB6 で Integer 型は 16 ビット符号付き整数型(-32768 ~ 32767)でしたが、VB.NET 以降では 32 ビット符号付き整数型に変わっています。
    今の代入、Select Case レベルなら実害はありませんが、ほかにもコードを移植されるのであればお気をつけください。

    • 回答としてマーク hana0101 2012年8月8日 4:03
    2012年8月7日 14:29
    モデレータ
  • Azulean様、ありがとうございます。

    Option Strict が OFF なのかな?

    Option Strict は ON になっています。

    ところで、VB6 で Integer 型は 16 ビット符号付き整数型(-32768 ~ 32767)でしたが、VB.NET 以降では 32 ビット符号付き整数型に変わっています。

    今の代入、Select Case レベルなら実害はありませんが、ほかにもコードを移植されるのであればお気をつけください。

    アドバイスありがとうございます。

    これから気を付けます。


    では、今回はこれで解決とさせて頂きます。

    2012年8月8日 4:03
  • 追記です。

    Option Strict はご指摘頂いた通り、Offでした…。

    勘違いしておりました。申し訳ありません。

    2012年8月9日 1:58