Anmelden

View Full Version : Convertierung nach ASCII HEX Code



mk
22-01-09, 14:34
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

jgv
22-01-09, 17:02
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

Fuerchau
23-01-09, 12:48
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.

jgv
23-01-09, 13:24
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

mk
23-01-09, 13:36
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

Fuerchau
24-01-09, 13:11
%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.

B.Hauser
24-01-09, 15:55
%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