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.
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")