View Full Version : Convertierung nach ASCII HEX Code
Hallo zusammen,
ich muss in einem RPG Programm einen String
als ASCI HEX umsetzten.
Hat jemand von euch Idee wie man das am einfachtsen lösen könnte?
Beispiel: TeSt
Soll sein im ASCII
54655374
Gruß
Michael
Hallo Michael
Die APIs QDCXLATE und iconv stehen beispielsweise zur Verfügung. Oder Du kannst das CCSID-Konzept verwenden.
Gruss
Jan
kuempi von stein
23-01-09, 12:35
mh...
besteht das Problem noch?
Ich würde mir da einfach ein kleines Progrämmchen basteln und das über eine Programmladezeittabelle lösen.
Sagt man doch so?
Anbei mal ein kleiner Entwurf, aber Achtung! Ist erstens nicht lauffähig und zweitens nach Oldstyle programmiert sprich mit zwei einfachen eindimensionalen Tabellen.
Und die Formatierung stimmt nicht.
Aber ich denke, so ist es am verständlichsten.
Also der Weg wäre dann:
Inputstring Buchstabe für Buchstabe auseinander nehmen.
Dann den Buchstaben in der Tabelle suchen.
Mit dem gefundenen Platz den Wert (FoundVal) aus zweiter Tabelle holen.
Fertig.
Ist bestimmt schlechter Stil, aber da keiner antwortet ist der schlechteste Vorschlag besser als nix denke ich.
kuempi
D InLen S 10I 0
D InChar S 1
D Pos S 5 P 0
D ST1 S 1 DIM(134) CTDATA PERRCD(1)
D ST2 S 2 DIM(134) CTDATA PERRCD(1)
C DO InLen Pos
C EVAL InChar = %SUBST(InString : Pos :1)
C EXSR GETVAL
C ENDDO
C GETVAL BEGSR
C Z-ADD 1 IDX 3 0
C InChar LOOKUP ST1(IDX) 9595
C MOVEL ST2(IDX) FoundVal
C ENDSR
** ST1
a
b
c
....usw
A
B
C
....usw
** ST2
61
62
63
....usw
41
42
43
Schön für die Mühe, aber ich denke QDCXLATE war schon das Richtige.
Flexibler ist hier das Convert a Graphic Character String (CDRCVRT, QTQCVRT) API (http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/apis/CDRCVRT.htm?resultof=%22%43%44%52%43%56%52%54%22%2 0%22%63%64%72%63%76%72%22%20)
, da man keine TBL-Objekte mehr benötigt.
Hier ein kleines Beispiel mit QDCXLATE.
d Translate PR ExtPgm('QDCXLATE')
d Length 5P 0 const
d Data 640A options(*varsize)
d Table 10A const
d string s 256a
/free
Translate(256 : string : 'QASCII'); // EBCDIC -> ASCII
/end-free
Die Tabelle QASCII ist in der Bibliothek QSYS vorhanden.
Gruss
Jan
Hallo zusammen,
vielen Dank für die Hilfestellung.
Nach einigem Kampf und Hilfe anderer Kollegen sind
wir jetzt ein bischen weiter.
Hier ist der bisherige Lösungsansatz
D Translate PR EXTPGM('QDCXLATE')
D TLen 5P 0 CONST
D Buff 32766A OPTIONS(*VARSIZE)
D Table 10A CONST
c eval #buff ='Der Wolfgang ist super'
C callp Translate(%len(%trim(#buff))
C :#BUFF :'QTCPASC')
C/EXEC SQL
c+ set :xhex = hex(trim(:#buff))
C/END-EXEC
Gruß
Michael
%trim ist soweit gefährlich, dass die Länge falsch berechnet wird, wenn Leerzeichen am Anfang stehen.
%checkr(' ':MyVar) wäre die bessere Alternative, wenn Leerzeichen am Ende nicht übersetzt werden müssen.
QDRCVRT ist insoweit besser, wenn verschiedene JOB-CCSID's relevant werden können und das Ziel ggf. Windows (1252) statt 850 wie in QTCPASC nötig sein sollte.
%trim ist soweit gefährlich, dass die Länge falsch berechnet wird, wenn Leerzeichen am Anfang stehen.
%checkr(' ':MyVar) wäre die bessere Alternative, wenn Leerzeichen am Ende nicht übersetzt werden müssen.
... ich würde %TrimR bevorzugen.
Birgitta