VB.net – ascii zu ebcdic converter

Wenn ihr zum Beispiel eine keyede DATAQ auf einer AS400 beschreiben wollt, müsst ihr zusätzlich zu den übergebenen Daten noch den Key mit mitsenden. Dieser muss zuvor von ASCII in EBCDIC gewandelt werden. Nun biete .net zwar viele Konverter von Haus aus an aber leider nicht das EBCDIC Format. Wenn ihr noch mehre Keys bestücken wollt, geht dies natürlich wieder am einfachsten über ein Funktion.
In Worten: Man übergibt der Funktion ein String Array und erhält ein EBCDIC Byte Array zurück.
In meinen Fall möchte ich einen Key mit max. 4 Zeichen konvertieren, meine zu beschreibende DATAQ hat einen Key von max. 4 Zeichen. Das Format beschränkt sich auf 0-9 und A-Z.
Wie immer, Kommentare helfen beim späteren zurechtfinden!
Funktion:

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'funktion - ascii zu ebcdic konverter
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Function func_ascii_to_ebcdic(sub_text As String)

Funktion definieren, Übergabevariable

Dim str_con(3) As string
Dim ary_translate(35,1) As String

str_con = Rückgabevariable, ary_translate werden die ASCII <> EBCDIC Werte zugewiesen

ary_translate(0,0) = "&HF0"
ary_translate(0,1) = "0"
ary_translate(1,0) = "&HF1"
ary_translate(1,1) = "1"
ary_translate(2,0) = "&HF2"
ary_translate(2,1) = "2"
ary_translate(3,0) = "&HF3"
ary_translate(3,1) = "3"
ary_translate(4,0) = "&HF4"
ary_translate(4,1) = "4"
ary_translate(5,0) = "&HF5"
ary_translate(5,1) = "5"
ary_translate(6,0) = "&HF6"
ary_translate(6,1) = "6"
ary_translate(7,0) = "&HF7"
ary_translate(7,1) = "7"
ary_translate(8,0) = "&HF8"
ary_translate(8,1) = "8"
ary_translate(9,0) = "&HF9"
ary_translate(9,1) = "9"

Nun etwas Copy&Paste Arbeit. Wie ihr sehen könnt, besitzt meine ary_translate Variable nur 2 Werte in der letzteren Dimension. 0 enthält immer den EBCDIC Byte Wert, 1 immer den ACSII Wert.

ary_translate(10,0) = "&HC1"
ary_translate(10,1) = "A"
ary_translate(11,0) = "&HC2"
ary_translate(11,1) = "B"
ary_translate(12,0) = "&HC3"
ary_translate(12,1) = "C"
ary_translate(13,0) = "&HC4"
ary_translate(13,1) = "D"
ary_translate(14,0) = "&HC5"
ary_translate(14,1) = "E"
ary_translate(15,0) = "&HC6"
ary_translate(15,1) = "F"
ary_translate(16,0) = "&HC7"
ary_translate(16,1) = "G"
ary_translate(17,0) = "&HC8"
ary_translate(17,1) = "H"
ary_translate(18,0) = "&HC9"
ary_translate(18,1) = "I"
ary_translate(19,0) = "&HD1"
ary_translate(19,1) = "J"
ary_translate(20,0) = "&HD2"
ary_translate(20,1) = "K"
ary_translate(21,0) = "&HD3"
ary_translate(21,1) = "L"
ary_translate(22,0) = "&HD4"
ary_translate(22,1) = "M"
ary_translate(23,0) = "&HD5"
ary_translate(23,1) = "N"
ary_translate(24,0) = "&HD6"
ary_translate(24,1) = "O"
ary_translate(25,0) = "&HD7"
ary_translate(25,1) = "P"
ary_translate(26,0) = "&HD8"
ary_translate(26,1) = "Q"
ary_translate(27,0) = "&HD9"
ary_translate(27,1) = "R"
ary_translate(28,0) = "&HE2"
ary_translate(28,1) = "S"
ary_translate(29,0) = "&HE3"
ary_translate(29,1) = "T"
ary_translate(30,0) = "&HE4"
ary_translate(30,1) = "U"
ary_translate(31,0) = "&HE5"
ary_translate(31,1) = "V"
ary_translate(32,0) = "&HE6"
ary_translate(32,1) = "W"
ary_translate(33,0) = "&HE7"
ary_translate(33,1) = "X"
ary_translate(34,0) = "&HE8"
ary_translate(34,1) = "Y"
ary_translate(35,0) = "&HE9"
ary_translate(35,1) = "Z"

Die ary_translate Variable enthält nun alle Großbuchstaben und die Ziffern 0 bis 9.

For x = 0 To 3
    For y = 0 To 35
        If UCase(mid(sub_text, x + 1,1)) = ary_translate(y,1) Then
            str_con(x) = ary_translate(y,0)
        End If
    Next
Next

Über UCase und mid nimmt man jeweils ein Zeichen des übergebenen Strings und vergleicht diesen über die Schleifen mit den entsprechenden Werten in der ary_translate Variable. Bei Übereinstimmung wird der Byte Wert in die Rückgabevariable gespeichert.

Return str_con
End Function

Wert zurückgeben und Funktion beenden. Bei der Rückgabe handelt es sich um ein Array, dementsprechend wird beim Aufruf als Empfangsvariable auch ein Array erwartet. Möchtet ihr mehr als 4 Zeichen konvertieren, müsst ihr die Arrays auf eure gewünschte Größe anpassen. Bei nicht vorbestimmten Array Größen könnte man auch mit array.length in den Schleifen arbeiten.
Anwendung: als praktisches Beispiel in dem nächsten VB.net Beitrag
In Deutschland wird das EBCDIC Format 273 verwendet.

2 thoughts on “VB.net – ascii zu ebcdic converter

  1. Etwas optimierter (hier als VBS-Version) geht das so:
    Function func_ascii_to_ebcdic(sub_text)
    ' Mappings
    code1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    code2 = "F0F1F2F3F4F5F6F7F8F9C1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E9"
    res = ""
    For x = 1 To Len(sub_text)
    ' Position im Ersten String Finden
    pos = InStr(code1, UCase( Mid(sub_text, x, 1)))
    res = res + "&H" + Mid(code2, (pos - 1) * 2 + 1, 2)
    Next
    func_ascii_to_ebcdic = res
    End Function
    WScript.Echo func_ascii_to_ebcdic("0123")

Comments are closed.