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) = "&amp;HF0"
ary_translate(0,1) = "0"
ary_translate(1,0) = "&amp;HF1"
ary_translate(1,1) = "1"
ary_translate(2,0) = "&amp;HF2"
ary_translate(2,1) = "2"
ary_translate(3,0) = "&amp;HF3"
ary_translate(3,1) = "3"
ary_translate(4,0) = "&amp;HF4"
ary_translate(4,1) = "4"
ary_translate(5,0) = "&amp;HF5"
ary_translate(5,1) = "5"
ary_translate(6,0) = "&amp;HF6"
ary_translate(6,1) = "6"
ary_translate(7,0) = "&amp;HF7"
ary_translate(7,1) = "7"
ary_translate(8,0) = "&amp;HF8"
ary_translate(8,1) = "8"
ary_translate(9,0) = "&amp;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) = "&amp;HC1"
ary_translate(10,1) = "A"
ary_translate(11,0) = "&amp;HC2"
ary_translate(11,1) = "B"
ary_translate(12,0) = "&amp;HC3"
ary_translate(12,1) = "C"
ary_translate(13,0) = "&amp;HC4"
ary_translate(13,1) = "D"
ary_translate(14,0) = "&amp;HC5"
ary_translate(14,1) = "E"
ary_translate(15,0) = "&amp;HC6"
ary_translate(15,1) = "F"
ary_translate(16,0) = "&amp;HC7"
ary_translate(16,1) = "G"
ary_translate(17,0) = "&amp;HC8"
ary_translate(17,1) = "H"
ary_translate(18,0) = "&amp;HC9"
ary_translate(18,1) = "I"
ary_translate(19,0) = "&amp;HD1"
ary_translate(19,1) = "J"
ary_translate(20,0) = "&amp;HD2"
ary_translate(20,1) = "K"
ary_translate(21,0) = "&amp;HD3"
ary_translate(21,1) = "L"
ary_translate(22,0) = "&amp;HD4"
ary_translate(22,1) = "M"
ary_translate(23,0) = "&amp;HD5"
ary_translate(23,1) = "N"
ary_translate(24,0) = "&amp;HD6"
ary_translate(24,1) = "O"
ary_translate(25,0) = "&amp;HD7"
ary_translate(25,1) = "P"
ary_translate(26,0) = "&amp;HD8"
ary_translate(26,1) = "Q"
ary_translate(27,0) = "&amp;HD9"
ary_translate(27,1) = "R"
ary_translate(28,0) = "&amp;HE2"
ary_translate(28,1) = "S"
ary_translate(29,0) = "&amp;HE3"
ary_translate(29,1) = "T"
ary_translate(30,0) = "&amp;HE4"
ary_translate(30,1) = "U"
ary_translate(31,0) = "&amp;HE5"
ary_translate(31,1) = "V"
ary_translate(32,0) = "&amp;HE6"
ary_translate(32,1) = "W"
ary_translate(33,0) = "&amp;HE7"
ary_translate(33,1) = "X"
ary_translate(34,0) = "&amp;HE8"
ary_translate(34,1) = "Y"
ary_translate(35,0) = "&amp;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.

Share and Bookmark Diese Icons verlinken auf Bookmark Dienste bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • Misterwong in VB.net - ascii zu ebcdic converter
  • Yigg in VB.net - ascii zu ebcdic converter
  • Webnews in VB.net - ascii zu ebcdic converter
  • Digg in VB.net - ascii zu ebcdic converter
  • Delicious in VB.net - ascii zu ebcdic converter
  • Stumbleupon in VB.net - ascii zu ebcdic converter
  • Reddit in VB.net - ascii zu ebcdic converter
  • Google in VB.net - ascii zu ebcdic converter

One Comment

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

    g0pher said on: 21. Juli 2010 09:50

Post a Comment

Your email is never published nor shared. Required fields are marked *

*

*

Type your comment out: