ASCII 文字コードと EBCDIC 文字コードとの変換方法をvb2005で実現するには?

解決


くまくま  2008-02-18 12:06:47  No: 100298  IP: 192.*.*.*

下記サイトにてVBA用のコードを見つけvb2005で実現しようとしたのですが
うまく動きません  どうすいればよいか教えていただきたいです
最終目標はEIAコード(ncドリルコード)をASCIIコードにしようと思っています。
http://support.microsoft.com/kb/216399/ja
自分のコード
Dim FullPaths As New ArrayList
    Dim sEBCDIC As String
    Dim sASCII As String
    Dim PPP As String

    Function Translate(ByVal InText As String, ByVal xlatTable As String) As String
        '
        ' 
        '一つの文字セットからもう一つまでInTextを図にするために、翻訳テーブルを使います。
        Dim Temp As String, I As Long
        Temp = Space(Len(InText)) '文字数分のエリアを確保する
        For I = 1 To Len(InText) 'intextの文字数だけ回す
            'Asc(Mid(InText, I, 1))これでバイナリー数値(10進数)になる
            Mid(Temp, I, 1) = Mid(xlatTable, Asc(Mid(InText, I, 1)) + 1, 1)
            'つまりxlatTable表のバイナリー数+1から1文字がTEMPの1文字に差し替わる
            'Asc()文字に対応する文字コードを表す整数型
        Next I
        Translate = Temp
    End Function

    Function ASCII_To_EBCDIC_Table() As String
        '
        'EBCDICストリングにアスキー-ISO/ANSIストリングを翻訳する
        'Translate機能による使用のためのストリングとして、
        '以下のテーブルを返します。
        ' 00 01 02 03 37 2D 2E 2F 16 05 25 0B 0C 0D 0E 0F
        ' 10 11 12 13 3C 3D 32 26 18 19 3F 27 1C 1D 1E 1F
        ' 40 5A 7F 7B 5B 6C 50 7D 4D 5D 5C 4E 6B 60 4B 61
        ' F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 7A 5E 4C 7E 6E 6F
        ' 7C C1 C2 C3 C4 C5 C6 C7 C8 C9 D1 D2 D3 D4 D5 D6
        ' D7 D8 D9 E2 E3 E4 E5 E6 E7 E8 E9 AD E0 BD 5F 6D
        ' 79 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96
        ' 97 98 99 A2 A3 A4 A5 A6 A7 A8 A9 C0 4F D0 A1 07
        ' 20 21 22 23 24 15 06 17 28 29 2A 2B 2C 09 0A 1B
        ' 30 31 1A 33 34 35 36 08 38 39 3A 3B 04 14 3E E1
        ' 41 42 43 44 45 46 47 48 49 51 52 53 54 55 56 57
        ' 58 59 62 63 64 65 66 67 68 69 70 71 72 73 74 75
        ' 76 77 78 80 8A 8B 8C 8D 8E 8F 90 9A 9B 9C 9D 9E
        ' 9F A0 AA AB AC 4A AE AF B0 B1 B2 B3 B4 B5 B6 B7
        ' B8 B9 BA BB BC 6A BE BF CA CB CC CD CE CF DA dB
        ' DC DD DE DF EA EB EC ED EE EF FA FB FC FD FE FF
        '

        ASCII_To_EBCDIC_Table = _
        HexToStr("00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F") & _
        HexToStr("405A7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F") & _
        HexToStr("7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D") & _
        HexToStr("79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C04FD0A107") & _
        HexToStr("202122232415061728292A2B2C090A1B30311A333435360838393A3B04143EE1") & _
        HexToStr("4142434445464748495152535455565758596263646566676869707172737475") & _
        HexToStr("767778808A8B8C8D8E8F909A9B9C9D9E9FA0AAABAC4AAEAFB0B1B2B3B4B5B6B7") & _
        HexToStr("B8B9BABBBC6ABEBFCACBCCCDCECFDADBDCDDDEDFEAEBECEDEEEFFAFBFCFDFEFF")
    End Function

    Function EBCDIC_To_ASCII_Table() As String
        '
        ' Returns the following table as a string for use by the Translate
        ' function to traslate an EBCDIC string to an ASCII-ISO/ANSI string.
        '
        ' 00 01 02 03 9C 09 86 7F 97 8D 8E 0B 0C 0D 0E 0F    ....œ.†-E#381;.....
        ' 10 11 12 13 9D 85 08 87 18 19 92 8F 1C 1D 1E 1F    ....E...‡..'E...
        ' 80 81 82 83 84 0A 17 1B 88 89 8A 8B 8C 05 06 07    €E#8218;ƒ"...ˆ‰Š‹Œ...
        ' 90 91 16 93 94 95 96 04 98 99 9A 9B 14 15 9E 1A    E.""•-.˜(tm)š›..ž.
        ' 20 A0 A1 A2 A3 A4 A5 A6 A7 A8 D5 2E 3C 28 2B 7C    . &#161;&#162;&#163;&#164;&#165;&#166;&#167;...<(+|
        ' 26 A9 AA AB AC AD AE AF B0 B1 21 24 2A 29 3B 5E    &(c)&#170;"&#172;&#173;(r)&#175;&#176;&#177;!$*);^
        ' 2D 2F B2 B3 B4 B5 B6 B7 B8 B9 E5 2C 25 5F 3E 3F    -/&#178;&#179;&#180;&#181;&#182;&#183;&#184;&#185;.,%_>?
        ' BA BB BC BD BE BF C0 C1 C2 60 3A 23 40 27 3D 22    &#186;"1/41/23/4&#191;...`:#@'="
        ' C3 61 62 63 64 65 66 67 68 69 C4 C5 C6 C7 C8 C9    .abcdefghi......
        ' CA 6A 6B 6C 6D 6E 6F 70 71 72 CB CC CD CE CF D0    .jklmnopqr......
        ' D1 7E 73 74 75 76 77 78 79 7A D2 D3 D4 5B D6 D7    .~stuvwxyz...[..
        ' D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 5D E6 E7    .............]..
        ' 7B 41 42 43 44 45 46 47 48 49 E8 E9 EA EB EC ED    {ABCDEFGHI......
        ' 7D 4A 4B 4C 4D 4E 4F 50 51 52 EE EF F0 F1 F2 F3    }JKLMNOPQR......
        ' 5C 9F 53 54 55 56 57 58 59 5A F4 F5 F6 F7 F8 F9    \.STUVWXYZ......
        ' 30 31 32 33 34 35 36 37 38 39 FA FB FC FD FE FF    0123456789......
        '
        EBCDIC_To_ASCII_Table = _
        HexToStr("000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F") & _
        HexToStr("80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A") & _
        HexToStr("20A0A1A2A3A4A5A6A7A8D52E3C282B7C26A9AAABACADAEAFB0B121242A293B5E") & _
        HexToStr("2D2FB2B3B4B5B6B7B8B9E52C255F3E3FBABBBCBDBEBFC0C1C2603A2340273D22") & _
        HexToStr("C3616263646566676869C4C5C6C7C8C9CA6A6B6C6D6E6F707172CBCCCDCECFD0") & _
        HexToStr("D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7") & _
        HexToStr("7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3") & _
        HexToStr("5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF")

    End Function

    Function HexToStr(ByVal HexStr As String) As String
        Dim Temp As String, I As Long
        Temp = Space(Len(HexStr) \ 2) '(Len(HexStr)で文字数が64)/2で32のスペースをTEMPに確保
        For I = 1 To (Len(HexStr) \ 2)
            Mid(Temp, I, 1) = Chr(Val("&H" & Mid(HexStr, I * 2 - 1, 2))) '指定された文字コードに対応する文字を返します。
        Next I

        HexToStr = Temp
    End Function
    Private Sub Form1_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
        Dim FileName As String
        Dim I As Integer = 0
        Do
            FileName = CType(e.Data.GetData(DataFormats.FileDrop), String())(I)
            I = I + 1
            FullPaths.Add(FileName)
            ListBox1.Items.Add(IO.Path.GetFileName(FileName))
        Loop Until ("" = CType(e.Data.GetData(DataFormats.FileDrop), String())(I))
    End Sub

    Private Sub Form1_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim St As String
        For Each St In FullPaths
            '読み込み
            Dim Reader As New IO.StreamReader(St)
            sASCII = Reader.ReadToEnd
            Reader.Close()
            sEBCDIC = Translate(sASCII, ASCII_To_EBCDIC_Table())
            '書き込み
            Dim Writer As New IO.StreamWriter(IO.Path.ChangeExtension(St, TextBox1.Text))
            Writer.WriteLine(sEBCDIC)
            Writer.Close()
        Next
        MsgBox("変換終了")
    End Sub

編集 削除
やじゅ  2008-02-18 12:38:41  No: 100299  IP: 192.*.*.*

>うまく動きません  
うまく動きませんは、どのようにうまく動かないのでしょうか?
説明してください。
どこまで正常に動いて、どこがおかしいのか
コンパイルエラーとなっているのか、実行時におかしいのか

ソースコード書いてあったも、解析して指摘するのは大変なのよ。

編集 削除
くまくま  2008-02-18 13:10:09  No: 100300  IP: 192.*.*.*

説明不足ですいません
うまく動かない内容は、
ASCIIからEBCDICに変換する時バイナリーコードのF0〜F9が
動かず00で処理されてしまうのです
確認方法はバイナリーエディタ(Stirling )を使っています。
コンパイラエラーはありません

編集 削除
YuO  2008-02-18 13:56:12  No: 100301  IP: 192.*.*.*

ASCIIコードに0x80以上のコードはありません。
変換先の本来のコードは,ISO-8859-1等の別のコードではないですか?

編集 削除
くまくま  2008-02-18 13:57:21  No: 100302  IP: 192.*.*.*

説明不足でごめんなさい
>>ASCIIからEBCDICに変換する時バイナリーコードのF0〜F9が
つまりASCIIでの0〜9がEBCDICの0〜9にならないと言うことでした
他の部分も動く所と動かない所があり
Function HexToStr(ByVal HexStr As String) As String
の所があやしいと思っているのですが・・・

編集 削除
YuO  2008-02-18 15:51:40  No: 100303  IP: 192.*.*.*

元の記事はVB6までを対象としているのですね。
それであれば,VB2005ではそのまま使うことはできません。

Unicodeを文字集合としない文字コードを使うなら,Byte配列を使ってください。
その上で,文字列にしたいのであればChar配列に代入後Stringのコンストラクタを使って変換します。

これ以上の話は,VB2005とのことなので,
・Visual Basic .NET掲示板
・Visual Basic 初心者掲示板
のどちらかで行ってください。

編集 削除
くまくま  2008-02-18 17:19:58  No: 100304  IP: 192.*.*.*

書き込み場所間違ってましたすいません。

編集 削除
くまくま  2008-02-18 17:40:06  No: 100305  IP: 192.*.*.*

YuO様、やじゅ様  ご意見ありがとうございました。
たいへん助かりました、
Byte配列やChar配列をもっと勉強しようと思います。

編集 削除
くまくま  2008-02-22 13:02:05  No: 100306  IP: 192.*.*.*

一様  勉強した結果報告
EIAコードのOD(復帰)をOA(改行)に変更してありますので
そのまま使う人がいたら気お付けてください
Public Class Form1
    Dim FullPaths As New ArrayList
    Dim sASCII As String
    Dim Buffer() As Byte
    Dim EBC As String = "000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F" & _
            "80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A" & _
            "20A0A1A2A3A4A5A6A7A8D52E3C282B7C26A9AAABACADAEAFB0B121242A293B5E" & _
            "2D2FB2B3B4B5B6B7B8B9E52C255F3E3FBABBBCBDBEBFC0C1C2603A2340273D22" & _
            "C3616263646566676869C4C5C6C7C8C9CA6A6B6C6D6E6F707172CBCCCDCECFD0" & _
            "D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7" & _
            "7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3" & _
            "5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF"
    Dim EBCDIC_Table() As Byte = GetBytes(EBC)
    Dim sEIA As String = "003132033405063738090A250C0D0E0F20111233143536171839281B1C1D1E1F" & _
        "3021225424565727285A082B2C2D2E2F302F53335535365859393A2C3C3D3E3F" & _
        "2D41424C444E4F474852294B4C4D4E4F504A4B534D55565051595A5B5C5D5E5F" & _
        "604142634465664748696A2E6C6D6E6F2B7172437445467778497A7B7C7D7E7F" & _
        "0A8182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F" & _
        "A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF" & _
        "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF" & _
        "E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"
    Dim EIA_Table() As Byte = GetBytes(sEIA)
    Function GetBytes(ByVal HexDecString As String) As Byte()

        '16進数表現の文字列を2文字ずつに区切り、
        'その表現に対応する数値の配列を返すメソッド。
        Dim i As Long
        Dim Length As Long
        Dim ret(0) As Byte

        '入力の長さを求める
        Length = Len(HexDecString) \ 2

        If Length > 0 Then
            '入力がある場合だけ処理をする
            'retの初期化
            ReDim ret(Length - 1)

            'retに代入していく
            For i = 1 To Length
                ret(i - 1) = Val("&h" & Mid$(HexDecString, i * 2 - 1, 2))
            Next
        End If

        '戻り値を設定
        GetBytes = ret

    End Function
    Private Sub Form1_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
        Dim FileName As String
        Dim I As Integer = 0
        Do
            FileName = CType(e.Data.GetData(DataFormats.FileDrop), String())(I)
            I = I + 1
            FullPaths.Add(FileName)
            ListBox1.Items.Add(IO.Path.GetFileName(FileName))
        Loop Until ("" = CType(e.Data.GetData(DataFormats.FileDrop), String())(I))
    End Sub

    Private Sub Form1_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.None
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim St As String
        Dim sC As String = "IBM290"
        
        For Each St In FullPaths
            If RadioButton1.Checked Then
                '読み込み
                Dim Reader As New IO.StreamReader(St, System.Text.Encoding.GetEncoding(sC))
                sASCII = Reader.ReadToEnd
                Reader.Close()
                '書き込み
                Dim Writer As New IO.StreamWriter(IO.Path.ChangeExtension(St, TextBox1.Text), False, System.Text.Encoding.ASCII)
                Writer.WriteLine(sASCII)
                Writer.Close()
            ElseIf RadioButton2.Checked Then
                'この変数に、ファイルのバイナリを格納します。
                'Dim Buffer() As Byte

                'ファイルの読み込みを行う部分です。
                '第2引数以降は、必要に応じて変更してみて下さい。
                Dim DataFile As New System.IO.FileStream(St, IO.FileMode.Open)

                'データファイルのサイズを調べています。
                Dim FileSize As Integer = CInt(DataFile.Length)
                If FileSize = 0 Then
                    '空のファイルであれば、データを読み込む必要も無いので、
                    'ファイルは読まず、テキストボックスを空にしています。
                    'Me.TextBox1.Clear()
                Else
                    'データがあった場合、データサイズに合わせて配列サイズを決定します。
                    '今回は、データ量と同サイズの配列を用意しています。
                    ReDim Buffer(FileSize - 1)

                    '用意した配列にデータを読み込みます。
                    '下記では、「Buffer(0)〜Buffer(FileSize-1)」に対して読み込ませています。
                    DataFile.Read(Buffer, 0, FileSize)    '★★

                    '置換コード
                    For I As Integer = 0 To Buffer.Length - 1 '文字数だけ回す

                        'Buffer(I) = EBCDIC_Table(Buffer(I))
                        Buffer(I) = EIA_Table(Buffer(I))
                    Next I

                    '受け取った配列を、BitConverterクラスを利用して、
                    'TextBoxに表示させます。
                    'Me.TextBox2.Text = System.BitConverter.ToString(Buffer)'beas64表記

                End If

                '開いたファイルは、最後に必ず閉じる必要があります。
                DataFile.Close()
                '書き込みの部分
                Dim outFile As New System.IO.FileStream(IO.Path.ChangeExtension(St, TextBox1.Text), IO.FileMode.Create)
                outFile.Write(Buffer, 0, Buffer.Length)
                outFile.Close()
            End If
            
        Next
        MsgBox("変換終了")
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        FullPaths.Clear()
        ListBox1.Items.Clear()

    End Sub
End Class

編集 削除