VBA Tipp: EBCDIC nach ASCII konvertieren

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich möchte Daten, die im Extended Binary Coded Decimal Interchange Code (EBCDIC) vorliegen, in ASCII konvertieren (bzw. umgekehrt von ASCII nach EBCDIC konvertieren).

Lösung

Public Function EBCDICtoASCII(E As String) As String
Dim Conv, I As Long, Ch As String * 1, Res As String
 
 Conv = Array( _
    0, 1, 2, 3, 0, 9, 0, 127, 0, 0, 0, 11, 12, 13, 14, 15, _
    16, 17, 18, 19, 0, 10, 8, 0, 24, 25, 0, 0, 28, 29, 30, 31, _
    0, 0, 0, 0, 0, 0, 23, 27, 0, 0, 0, 0, 0, 5, 6, 7, _
    0, 0, 22, 0, 0, 0, 0, 4, 0, 0, 0, 0, 20, 21, 0, 26, _
    32, 0, 0, 228, 224, 0, 0, 229, 231, 241, 91, 46, 60, 40, 43, 33, _
    38, 233, 0, 0, 232, 0, 0, 0, 236, 223, 93, 36, 42, 41, 59, 94, _
    45, 47, 0, 196, 0, 0, 0, 197, 0, 209, 166, 44, 37, 95, 62, 63, _
    248, 201, 0, 0, 0, 0, 0, 0, 0, 96, 58, 35, 64, 39, 61, 34, _
    216, 97, 98, 99, 100, 101, 102, 103, 104, 105, 0, 0, 240, 0, 254, 0, _
    176, 106, 107, 108, 109, 110, 111, 112, 113, 114, 0, 0, 230, 0, 198, 164, _
    181, 126, 115, 116, 117, 118, 119, 120, 121, 122, 0, 0, 208, 221, 222, 0, _
    162, 163, 0, 0, 0, 167, 0, 0, 0, 0, 172, 124, 175, 168, 180, 0, _
    123, 65, 66, 67, 68, 69, 70, 71, 72, 73, 0, 0, 246, 242, 0, 0, _
    125, 74, 75, 76, 77, 78, 79, 80, 81, 82, 0, 0, 252, 249, 0, 0, _
    92, 0, 83, 84, 85, 86, 87, 88, 89, 90, 0, 0, 214, 0, 0, 0, _
    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 0, 0, 220, 0, 0, 0)
 
  For I = 1 To Len(E)
    Ch = Mid(E, I, 1)
    Res = Res & Chr(Conv(Asc(Ch)))
  Next I
  EBCDICtoASCII = Res
End Function
 
Public Function ASCIItoEBCDIC(E As String) As String
Dim Conv, I As Long, Ch As String * 1, Res As String
 
 Conv = Array( _
   0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 21, 11, 12, 13, 14, 15, _
  16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, _
  64, 79, 127, 123, 91, 108, 80, 125, 77, 93, 92, 78, 107, 96, 75, 97, _
  240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 122, 94, 76, 126, 110, 111, _
  124, 193, 194, 195, 196, 197, 198, 199, 200, 201, 209, 210, 211, 212, 213, 214, _
  215, 216, 217, 226, 227, 228, 229, 230, 231, 232, 233, 74, 224, 90, 95, 109, _
  121, 129, 130, 131, 132, 133, 134, 135, 136, 137, 145, 146, 147, 148, 149, 150, _
  151, 152, 153, 162, 163, 164, 165, 166, 167, 168, 169, 192, 187, 208, 161, 7, _
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
  0, 0, 176, 177, 159, 0, 106, 181, 189, 0, 0, 0, 186, 0, 0, 188, _
  144, 0, 0, 0, 190, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
  0, 0, 0, 0, 99, 103, 158, 0, 0, 113, 0, 0, 0, 0, 0, 0, _
  172, 105, 0, 0, 0, 0, 236, 0, 128, 0, 0, 0, 252, 173, 174, 89, _
  68, 0, 0, 0, 67, 71, 156, 72, 84, 81, 0, 0, 88, 0, 0, 0, _
  140, 73, 205, 0, 0, 0, 204, 0, 112, 221, 0, 0, 220, 0, 142, 0)
 
  For I = 1 To Len(E)
    Ch = Mid(E, I, 1)
    Res = Res & Chr(Conv(Asc(Ch)))
  Next I
  ASCIItoEBCDIC = Res
End Function


Aufruf

Debug.Print EBCDICtoASCII("ȁ““–@æ…“£Z")
Hallo Welt!
Debug.Print ASCIItoEBCDIC("Na also!")
Ձ@“¢–Z
 
Debug.Print EBCDICtoASCII(ASCIItoEBCDIC("Öfters hörten ältere Bürger, " & _
"dass Müll auf der Straße Ursache häufiger Übelkeit wäre."))
Öfters hörten ältere Bürger, dass Müll auf der Straße Ursache häufiger Übelkeit wäre.

Anmerkungen

Diese Routinen sind nicht auf Geschwindigkeit optimiert - da kann man mit statischen Arrays usw. sicher noch einiges herausholen.

Sowohl ASCII als auch EBCDIC sind nur für die grundlegenden Zeichensätze wohldefiniert - für Sonderzeichen, Umlaute usw. gibt es in beiden Codes diverse unterschiedliche Darstellungsformen.

Zum Thema "unterschiedliche Codepages in EBCDIC" siehe z.B. hier: How do EBCDIC Latin 1 codepages differ. (Die obigen Beispiele verwenden die MS-Codepage 850 und die IBM-Codepage 500)