下記サイトにて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 . ¡¢£¤¥¦§...<(+|
' 26 A9 AA AB AC AD AE AF B0 B1 21 24 2A 29 3B 5E &(c)ª"¬­(r)¯°±!$*);^
' 2D 2F B2 B3 B4 B5 B6 B7 B8 B9 E5 2C 25 5F 3E 3F -/²³´µ¶·¸¹.,%_>?
' BA BB BC BD BE BF C0 C1 C2 60 3A 23 40 27 3D 22 º"1/41/23/4¿...`:#@'="
' 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
>うまく動きません
うまく動きませんは、どのようにうまく動かないのでしょうか?
説明してください。
どこまで正常に動いて、どこがおかしいのか
コンパイルエラーとなっているのか、実行時におかしいのか
ソースコード書いてあったも、解析して指摘するのは大変なのよ。
説明不足ですいません
うまく動かない内容は、
ASCIIからEBCDICに変換する時バイナリーコードのF0〜F9が
動かず00で処理されてしまうのです
確認方法はバイナリーエディタ(Stirling )を使っています。
コンパイラエラーはありません
ASCIIコードに0x80以上のコードはありません。
変換先の本来のコードは,ISO-8859-1等の別のコードではないですか?
説明不足でごめんなさい
>>ASCIIからEBCDICに変換する時バイナリーコードのF0〜F9が
つまりASCIIでの0〜9がEBCDICの0〜9にならないと言うことでした
他の部分も動く所と動かない所があり
Function HexToStr(ByVal HexStr As String) As String
の所があやしいと思っているのですが・・・
元の記事はVB6までを対象としているのですね。
それであれば,VB2005ではそのまま使うことはできません。
Unicodeを文字集合としない文字コードを使うなら,Byte配列を使ってください。
その上で,文字列にしたいのであればChar配列に代入後Stringのコンストラクタを使って変換します。
これ以上の話は,VB2005とのことなので,
・Visual Basic .NET掲示板
・Visual Basic 初心者掲示板
のどちらかで行ってください。
書き込み場所間違ってましたすいません。
編集 削除YuO様、やじゅ様 ご意見ありがとうございました。
たいへん助かりました、
Byte配列やChar配列をもっと勉強しようと思います。
一様 勉強した結果報告
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