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 ]