ANK文字のJIS8→EBCDIC変換
それほど機会がないと思いますが・・・。(^^;A
ANK文字(1バイト文字)をJIS8(ASCII+半角カナ)からEBCDICコードへコード変換するプログラムです。テキストファイルの内容を汎用機用に変換する機会があったのですが
たかが1バイト文字を市販の変換ツールを使用してわざわざ変換するのスマートじゃないと言うことで作成しました。VB4.0以降の32ビット版だと文字列を勝手にUnicodeに変換してしまうため文字型の変数では処理できません。
そこでバイト型の配列を利用して処理しています。
'JIS-8のANK文字列をEDCDICのANKに変換
'戻り値はバイト型の配列(=バリアント型)
Private Function AsciiToEbicdic(Str As String) As Variant
Dim Tbl_AtoE(255) As Byte
Dim i As Integer
Dim Ebicdic_DATA() As Byte
'変換テーブルのセット
Tbl_AtoE(0) = &H0
Tbl_AtoE(1) = &H1
Tbl_AtoE(2) = &H2
Tbl_AtoE(3) = &H3
Tbl_AtoE(4) = &H37
Tbl_AtoE(5) = &H2D
Tbl_AtoE(6) = &H2E
Tbl_AtoE(7) = &H2F
Tbl_AtoE(8) = &H16
Tbl_AtoE(9) = &H5
Tbl_AtoE(10) = &H15
Tbl_AtoE(11) = &HB
Tbl_AtoE(12) = &HC
Tbl_AtoE(13) = &HD
Tbl_AtoE(14) = &HE
Tbl_AtoE(15) = &HF
Tbl_AtoE(16) = &H10
Tbl_AtoE(17) = &H11
Tbl_AtoE(18) = &H12
Tbl_AtoE(19) = &H13
Tbl_AtoE(20) = &H3C
Tbl_AtoE(21) = &H3D
Tbl_AtoE(22) = &H32
Tbl_AtoE(23) = &H26
Tbl_AtoE(24) = &H18
Tbl_AtoE(25) = &H19
Tbl_AtoE(26) = &H3F
Tbl_AtoE(27) = &H27
Tbl_AtoE(28) = &H1C
Tbl_AtoE(29) = &H1D
Tbl_AtoE(30) = &H1E
Tbl_AtoE(31) = &H1F
Tbl_AtoE(32) = &H40
Tbl_AtoE(33) = &H5A
Tbl_AtoE(34) = &H7F
Tbl_AtoE(35) = &H7B
Tbl_AtoE(36) = &HE0
Tbl_AtoE(37) = &H6C
Tbl_AtoE(38) = &H50
Tbl_AtoE(39) = &H7D
Tbl_AtoE(40) = &H4D
Tbl_AtoE(41) = &H5D
Tbl_AtoE(42) = &H5C
Tbl_AtoE(43) = &H4E
Tbl_AtoE(44) = &H6B
Tbl_AtoE(45) = &H60
Tbl_AtoE(46) = &H4B
Tbl_AtoE(47) = &H61
Tbl_AtoE(48) = &HF0
Tbl_AtoE(49) = &HF1
Tbl_AtoE(50) = &HF2
Tbl_AtoE(51) = &HF3
Tbl_AtoE(52) = &HF4
Tbl_AtoE(53) = &HF5
Tbl_AtoE(54) = &HF6
Tbl_AtoE(55) = &HF7
Tbl_AtoE(56) = &HF8
Tbl_AtoE(57) = &HF9
Tbl_AtoE(58) = &H7A
Tbl_AtoE(59) = &H5E
Tbl_AtoE(60) = &H4C
Tbl_AtoE(61) = &H7E
Tbl_AtoE(62) = &H6E
Tbl_AtoE(63) = &H6F
Tbl_AtoE(64) = &H7C
Tbl_AtoE(65) = &HC1
Tbl_AtoE(66) = &HC2
Tbl_AtoE(67) = &HC3
Tbl_AtoE(68) = &HC4
Tbl_AtoE(69) = &HC5
Tbl_AtoE(70) = &HC6
Tbl_AtoE(71) = &HC7
Tbl_AtoE(72) = &HC8
Tbl_AtoE(73) = &HC9
Tbl_AtoE(74) = &HD1
Tbl_AtoE(75) = &HD2
Tbl_AtoE(76) = &HD3
Tbl_AtoE(77) = &HD4
Tbl_AtoE(78) = &HD5
Tbl_AtoE(79) = &HD6
Tbl_AtoE(80) = &HD7
Tbl_AtoE(81) = &HD8
Tbl_AtoE(82) = &HD9
Tbl_AtoE(83) = &HE2
Tbl_AtoE(84) = &HE3
Tbl_AtoE(85) = &HE4
Tbl_AtoE(86) = &HE5
Tbl_AtoE(87) = &HE6
Tbl_AtoE(88) = &HE7
Tbl_AtoE(89) = &HE8
Tbl_AtoE(90) = &HE9
Tbl_AtoE(91) = &H4A
Tbl_AtoE(92) = &H5B
Tbl_AtoE(93) = &H40
Tbl_AtoE(94) = &H5F
Tbl_AtoE(95) = &H6D
Tbl_AtoE(96) = &H40
Tbl_AtoE(97) = &HC1
Tbl_AtoE(98) = &HC2
Tbl_AtoE(99) = &HC3
Tbl_AtoE(100) = &HC4
Tbl_AtoE(101) = &HC5
Tbl_AtoE(102) = &HC6
Tbl_AtoE(103) = &HC7
Tbl_AtoE(104) = &HC8
Tbl_AtoE(105) = &HC9
Tbl_AtoE(106) = &HD1
Tbl_AtoE(107) = &HD2
Tbl_AtoE(108) = &HD3
Tbl_AtoE(109) = &HD4
Tbl_AtoE(110) = &HD5
Tbl_AtoE(111) = &HD6
Tbl_AtoE(112) = &HD7
Tbl_AtoE(113) = &HD8
Tbl_AtoE(114) = &HD9
Tbl_AtoE(115) = &HE2
Tbl_AtoE(116) = &HE3
Tbl_AtoE(117) = &HE4
Tbl_AtoE(118) = &HE5
Tbl_AtoE(119) = &HE6
Tbl_AtoE(120) = &HE7
Tbl_AtoE(121) = &HE8
Tbl_AtoE(122) = &HE9
Tbl_AtoE(123) = &H40
Tbl_AtoE(124) = &H4F
Tbl_AtoE(125) = &H40
Tbl_AtoE(126) = &HA1
Tbl_AtoE(127) = &H7
Tbl_AtoE(128) = &H40
Tbl_AtoE(129) = &H40
Tbl_AtoE(130) = &H40
Tbl_AtoE(131) = &H40
Tbl_AtoE(132) = &H40
Tbl_AtoE(133) = &H40
Tbl_AtoE(134) = &H40
Tbl_AtoE(135) = &H40
Tbl_AtoE(136) = &H40
Tbl_AtoE(137) = &H40
Tbl_AtoE(138) = &H40
Tbl_AtoE(139) = &H40
Tbl_AtoE(140) = &H40
Tbl_AtoE(141) = &H40
Tbl_AtoE(142) = &H40
Tbl_AtoE(143) = &H40
Tbl_AtoE(144) = &H40
Tbl_AtoE(145) = &H40
Tbl_AtoE(146) = &H40
Tbl_AtoE(147) = &H40
Tbl_AtoE(148) = &H40
Tbl_AtoE(149) = &H40
Tbl_AtoE(150) = &H40
Tbl_AtoE(151) = &H40
Tbl_AtoE(152) = &H40
Tbl_AtoE(153) = &H40
Tbl_AtoE(154) = &H40
Tbl_AtoE(155) = &H40
Tbl_AtoE(156) = &H40
Tbl_AtoE(157) = &H40
Tbl_AtoE(158) = &H40
Tbl_AtoE(159) = &H40
Tbl_AtoE(160) = &H40
Tbl_AtoE(161) = &H41
Tbl_AtoE(162) = &H42
Tbl_AtoE(163) = &H43
Tbl_AtoE(164) = &H44
Tbl_AtoE(165) = &H45
Tbl_AtoE(166) = &H46
Tbl_AtoE(167) = &H47
Tbl_AtoE(168) = &H48
Tbl_AtoE(169) = &H49
Tbl_AtoE(170) = &H51
Tbl_AtoE(171) = &H52
Tbl_AtoE(172) = &H53
Tbl_AtoE(173) = &H54
Tbl_AtoE(174) = &H55
Tbl_AtoE(175) = &H56
Tbl_AtoE(176) = &H58
Tbl_AtoE(177) = &H81
Tbl_AtoE(178) = &H82
Tbl_AtoE(179) = &H83
Tbl_AtoE(180) = &H84
Tbl_AtoE(181) = &H85
Tbl_AtoE(182) = &H86
Tbl_AtoE(183) = &H87
Tbl_AtoE(184) = &H88
Tbl_AtoE(185) = &H89
Tbl_AtoE(186) = &H8A
Tbl_AtoE(187) = &H8C
Tbl_AtoE(188) = &H8D
Tbl_AtoE(189) = &H8E
Tbl_AtoE(190) = &H8F
Tbl_AtoE(191) = &H90
Tbl_AtoE(192) = &H91
Tbl_AtoE(193) = &H92
Tbl_AtoE(194) = &H93
Tbl_AtoE(195) = &H94
Tbl_AtoE(196) = &H95
Tbl_AtoE(197) = &H96
Tbl_AtoE(198) = &H97
Tbl_AtoE(199) = &H98
Tbl_AtoE(200) = &H99
Tbl_AtoE(201) = &H9A
Tbl_AtoE(202) = &H9D
Tbl_AtoE(203) = &H9E
Tbl_AtoE(204) = &H9F
Tbl_AtoE(205) = &HA2
Tbl_AtoE(206) = &HA3
Tbl_AtoE(207) = &HA4
Tbl_AtoE(208) = &HA5
Tbl_AtoE(209) = &HA6
Tbl_AtoE(210) = &HA7
Tbl_AtoE(211) = &HA8
Tbl_AtoE(212) = &HA9
Tbl_AtoE(213) = &HAA
Tbl_AtoE(214) = &HAC
Tbl_AtoE(215) = &HAD
Tbl_AtoE(216) = &HAE
Tbl_AtoE(217) = &HAF
Tbl_AtoE(218) = &HBA
Tbl_AtoE(219) = &HBB
Tbl_AtoE(220) = &HBC
Tbl_AtoE(221) = &HBD
Tbl_AtoE(222) = &HBE
Tbl_AtoE(223) = &HBF
Tbl_AtoE(224) = &H40
Tbl_AtoE(225) = &H40
Tbl_AtoE(226) = &H40
Tbl_AtoE(227) = &H40
Tbl_AtoE(228) = &H40
Tbl_AtoE(229) = &H40
Tbl_AtoE(230) = &H40
Tbl_AtoE(231) = &H40
Tbl_AtoE(232) = &H40
Tbl_AtoE(233) = &H40
Tbl_AtoE(234) = &H40
Tbl_AtoE(235) = &H40
Tbl_AtoE(236) = &H40
Tbl_AtoE(237) = &H40
Tbl_AtoE(238) = &H40
Tbl_AtoE(239) = &H40
Tbl_AtoE(240) = &H40
Tbl_AtoE(241) = &H40
Tbl_AtoE(242) = &H40
Tbl_AtoE(243) = &H40
Tbl_AtoE(244) = &H40
Tbl_AtoE(245) = &H40
Tbl_AtoE(246) = &H40
Tbl_AtoE(247) = &H40
Tbl_AtoE(248) = &H40
Tbl_AtoE(249) = &H40
Tbl_AtoE(250) = &H40
Tbl_AtoE(251) = &H40
Tbl_AtoE(252) = &H40
Tbl_AtoE(253) = &H40
Tbl_AtoE(254) = &H40
Tbl_AtoE(255) = &H40
'配列を割り当て
ReDim Ebicdic_DATA(Len(Str) - 1)
'EBCDICに変換
For i = 1 To Len(Str)
Ebicdic_DATA(i - 1) = Tbl_AtoE(Asc(Mid(Str, i, 1)))
Next i
AsciiToEbicdic = Ebicdic_DATA
End Function
かなり強引なルーチンです。(笑)
呼び出すたびにEBCDICコードを格納している配列「EBCDICコード変換テーブル(Tbl_AtoE)」にEBCDICコードをセットしていますので、大量のデータを変換する場合はオーバーヘッドが大きくなる可能性があります。
処理効率の低下が懸念される場合はEBCDICコードをセットを別ルーチンにしてください。やってる事は大したことはありません。
引数である変換元文字列の文字数分のバイト型配列にRedimステートメントで必要な(文字数分の)メモリを割り当て、そこにAsc関数を使用して「EBCDICコード変換テーブル(Tbl_AtoE)」から対応するEBCDICコードを取得してセットしています。なお、このサンプルの変換テーブルは
JIS8 EBCDIC 数字・記号 → 数字・記号 カナ文字 → カナ文字 英小文字 → 英大文字 英大文字 → 英大文字 と、「英小文字」を「英大文字」に変換しています。
これは規格化されていないEBCDICコードの仕様で、EBCDICコードでは「カナ文字」と「英小文字」の文字コードが同じための処置です。
(例えばEBCDICコード"81h"は、半角カナの"ア"であり、英小文字の"a"でもあるのです。使用しているシステムによってどっちに解釈するかが決まります)
問題がある場合は、変換テーブルにセットしている値を修正してください。
具体的な使用例はこんな感じです。
Private Sub Command1_Click()
Dim i As Integer
Dim OUT_DATA() As Byte
'文字列をEDCDICに変換
'戻り値はバイト型の配列(=バリアント型)
OUT_DATA() = AsciiToEbicdic(Text2.Text)
'バイナリモードでオープンするため予めファイル削除
If Dir(Text1.Text) <> "" Then
Kill Text1.Text
End If
'バイナリモードでオープン
Open Text1.Text For Binary As #1
'変換されたEDCDIC文字列を1バイトずつ出力
For i = 0 To UBound(OUT_DATA)
Put #1, , OUT_DATA(i)
Next i
Close #1
Beep
MsgBox "終わったよん"
End Sub
ファイルに出力する場合は、上の例のようにバイナリモードで開いてPutステートメントで出力しないと、VBの「勝手に変換機能」が働いてしまいます・・・。
[ Window Close ]