Discussione:
Convertire stringa da esadecimale a alfanumerica
(troppo vecchio per rispondere)
Gatto
2011-07-27 14:28:28 UTC
Permalink
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
faccio così:
eval NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4

Grazie in anticipo
Marco
Dr.Ugo Gagliardelli
2011-07-27 14:49:08 UTC
Permalink
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
I casi sono tre: O non ho capito, o non ti sei spiegato oppure ti stai
perdendo in un bicchier d'acqua.

L'istruzione:
NomeVar = %trim(NomeVar) + Var2;
di fatto appende il contenuto di var2, esattamente come:
NomeVar = %trim(NomeVar) + x'0d0a';
solo che nel secondo caso hai utilizzato una costante letterale, ma se fai:
var2 = x'0d0a';
NomeVar = %trim(NomeVar) + Var2;
ottieni lo stesso effetto, ovvero concateni i due byte la cui
reppresentazione esadecimale e' 0D0A.
Gatto
2011-07-27 15:35:41 UTC
Permalink
Post by Dr.Ugo Gagliardelli
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval   NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
I casi sono tre: O non ho capito, o non ti sei spiegato oppure ti stai
perdendo in un bicchier d'acqua.
o anche tutte e tre
Post by Dr.Ugo Gagliardelli
NomeVar = %trim(NomeVar) + Var2;
In pratica facciamo finta che sia così
Var2 = '0d0a' (non x'0d0a')
Voglio ottenere tramite la variabile Var2 (che contiene la
rappresentazione esadecimale) lo stesso risultato che ottengo facendo:
eval NomeVar = %trim(NomeVar) + x'0d0a'
Post by Dr.Ugo Gagliardelli
NomeVar = %trim(NomeVar) + x'0d0a';
var2 =  x'0d0a';
NomeVar = %trim(NomeVar) + Var2;
ottieni lo stesso effetto, ovvero concateni i due byte la cui
reppresentazione esadecimale e' 0D0A.
Grazie
Marco
stefano[dot]tassi[at]dedanext[dot]it
2011-07-27 14:50:03 UTC
Permalink
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval   NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
Grazie in anticipo
Marco
una variabile puo' contenere dati esadecimali, quindi il problema non
si pone:

se una var di 2 byte
var2a = x'0d0a'
puoi concatenarla senza problemi

NomeVar = %trim(NomeVar) + var2a'

il tuo problema*forse* è popolarla correttamente.
forse la soluzione la trovi usando cvtch()
Gatto
2011-07-28 07:19:10 UTC
Permalink
On 27 Lug, 16:50, "stefano[dot]tassi[at]dedanext[dot]it"
Post by stefano[dot]tassi[at]dedanext[dot]it
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval   NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
Grazie in anticipo
Marco
una variabile puo' contenere dati esadecimali, quindi il problema non
se una var di 2 byte
var2a = x'0d0a'
puoi concatenarla senza problemi
NomeVar = %trim(NomeVar) + var2a'
il tuo problema*forse* è popolarla correttamente.
forse la soluzione la trovi usando cvtch()
Praticamente io devo fare il contrario di cvtch che converte una
stringa alfanumerica in esadecimale: io ricevo una stringa esadecimale
e la devo convertire in una stringa alfanumerica.
Quindi in NomeVar devo aggiungere x'contenuto_di_Var2', e Var2
contiene '0d0a' (4 caratteri, non x'0d0a' che sono 2 caratteri), ma
potrebbe contenere qualsiasi altro valore esadecimale altrimenti
userei la tecnica che dici tu, e l'ho già usata in varie occasioni. E'
possibile?

Grazie
Marco
Mauro Romeo
2011-07-28 07:56:12 UTC
Permalink
Post by Gatto
On 27 Lug, 16:50, "stefano[dot]tassi[at]dedanext[dot]it"
Post by stefano[dot]tassi[at]dedanext[dot]it
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
Grazie in anticipo
Marco
una variabile puo' contenere dati esadecimali, quindi il problema non
se una var di 2 byte
var2a = x'0d0a'
puoi concatenarla senza problemi
NomeVar = %trim(NomeVar) + var2a'
il tuo problema*forse* è popolarla correttamente.
forse la soluzione la trovi usando cvtch()
Praticamente io devo fare il contrario di cvtch che converte una
stringa alfanumerica in esadecimale: io ricevo una stringa esadecimale
e la devo convertire in una stringa alfanumerica.
Quindi in NomeVar devo aggiungere x'contenuto_di_Var2', e Var2
contiene '0d0a' (4 caratteri, non x'0d0a' che sono 2 caratteri), ma
potrebbe contenere qualsiasi altro valore esadecimale altrimenti
userei la tecnica che dici tu, e l'ho già usata in varie occasioni. E'
possibile?
Grazie
Marco
cvtch converte da alfanumerico a esadecimale.
cvthc da esadecimale ad alfanumerico.
Mauro Romeo
Gatto
2011-07-29 13:30:53 UTC
Permalink
Post by Mauro Romeo
Post by Gatto
On 27 Lug, 16:50, "stefano[dot]tassi[at]dedanext[dot]it"
Post by stefano[dot]tassi[at]dedanext[dot]it
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval   NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
Grazie in anticipo
Marco
una variabile puo' contenere dati esadecimali, quindi il problema non
se una var di 2 byte
var2a = x'0d0a'
puoi concatenarla senza problemi
NomeVar = %trim(NomeVar) + var2a'
il tuo problema*forse* è popolarla correttamente.
forse la soluzione la trovi usando cvtch()
Praticamente io devo fare il contrario di cvtch che converte una
stringa alfanumerica in esadecimale: io ricevo una stringa esadecimale
e la devo convertire in una stringa alfanumerica.
Quindi in NomeVar devo aggiungere x'contenuto_di_Var2', e Var2
contiene '0d0a' (4 caratteri, non x'0d0a' che sono 2 caratteri), ma
potrebbe contenere qualsiasi altro valore esadecimale altrimenti
userei la tecnica che dici tu, e l'ho già usata in varie occasioni. E'
possibile?
Grazie
Marco
cvtch converte da alfanumerico a esadecimale.
cvthc da esadecimale ad alfanumerico.
Mauro Romeo
Sì, dopo mi sono accorto che c'era anche l'altro. Sto facendo un
programma per provare l'API, ma convertendo da esadecimale a
alfanumerico mida un errore:

Si è verificato un errore di dominio nella funzione
matematica.
Errore di funzione. C2M3001 non monitorato da UCOM267 all'istruzione
ad
alto livello 0000000032, istruzione
X'0000'.

La cosa strana è che sembra che le 2 funzioni funzionino al contrario
di come dovrebbe essere: cvthc mi converte da alfanumerico a numerico,
cvtch mi da l'errore.
Adesso non riesco a fare delle prove, ma andrò a verificare e magari
prendo spunto dall'esempio che ha postato Obelix.

Intanto grazie
Marco
Dr.Ugo Gagliardelli
2011-07-29 13:49:02 UTC
Permalink
Post by Gatto
Post by Mauro Romeo
cvtch converte da alfanumerico a esadecimale.
cvthc da esadecimale ad alfanumerico.
Mauro Romeo
Sì, dopo mi sono accorto che c'era anche l'altro. Sto facendo un
programma per provare l'API, ma convertendo da esadecimale a
Se non ricordo male i caratteri hex devono essere maiuscoli, ovvero
devono essere compresi tra f0 e f9 e tra c1 e c6, in pratica da A a F.
Mauro Romeo
2011-07-29 13:55:04 UTC
Permalink
Post by Gatto
Post by Mauro Romeo
Post by Gatto
On 27 Lug, 16:50, "stefano[dot]tassi[at]dedanext[dot]it"
Post by stefano[dot]tassi[at]dedanext[dot]it
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
Grazie in anticipo
Marco
una variabile puo' contenere dati esadecimali, quindi il problema non
se una var di 2 byte
var2a = x'0d0a'
puoi concatenarla senza problemi
NomeVar = %trim(NomeVar) + var2a'
il tuo problema*forse* è popolarla correttamente.
forse la soluzione la trovi usando cvtch()
Praticamente io devo fare il contrario di cvtch che converte una
stringa alfanumerica in esadecimale: io ricevo una stringa esadecimale
e la devo convertire in una stringa alfanumerica.
Quindi in NomeVar devo aggiungere x'contenuto_di_Var2', e Var2
contiene '0d0a' (4 caratteri, non x'0d0a' che sono 2 caratteri), ma
potrebbe contenere qualsiasi altro valore esadecimale altrimenti
userei la tecnica che dici tu, e l'ho già usata in varie occasioni. E'
possibile?
Grazie
Marco
cvtch converte da alfanumerico a esadecimale.
cvthc da esadecimale ad alfanumerico.
Mauro Romeo
Sì, dopo mi sono accorto che c'era anche l'altro. Sto facendo un
programma per provare l'API, ma convertendo da esadecimale a
Si è verificato un errore di dominio nella funzione
matematica.
Errore di funzione. C2M3001 non monitorato da UCOM267 all'istruzione
ad
alto livello 0000000032, istruzione
X'0000'.
La cosa strana è che sembra che le 2 funzioni funzionino al contrario
di come dovrebbe essere: cvthc mi converte da alfanumerico a numerico,
cvtch mi da l'errore.
Adesso non riesco a fare delle prove, ma andrò a verificare e magari
prendo spunto dall'esempio che ha postato Obelix.
Intanto grazie
Marco
Ti posto una routine che mi funziona. Ci sono varie cose tra cui la
conversione.
Vedi se ti serve. A me funziona sia con 5.4 che con 6.1 release
precedenti non le ho provate.
Mauro Romeo


//----------------------------------------------------------------------------//

// Calcolo xor e caratteri risultanti

// Risponde con un campo di 3 caratteri

// il primo è xor risultante

// i seguenti 2 la rappresentazione caratteri di ogni

// semibyte in rappresentazione ascii

P Calcxor B



D Calcxor PI 3A

D campodacontr 300A Const

*

*.. Chiamata conversione ASCII per controllo hash

D Cvthash PR ExtPgm('QDCXLATE')

D datalenght 5P 0 Const

D daticonvprm 2A

D tabconv 10A Const



* Campi di lavoro

D cx S 5I 0

D result S 2A

D xor S 1A Inz(x'55')



* Conversione da ex a carattere

D cvthc PR EXTPROC('cvthc')

D tgt 32767 OPTIONS(*VARSIZE)

D src 16383 OPTIONS(*VARSIZE)

D CONST

D tgt_bytes 10I 0 VALUE



/Free

For cx = 1 to %Len(%Trim(campodacontr));

xor = %BitXor(xor:%Subst(campodacontr:cx:1));

EndFor;

cvthc(result:xor:%LEN(xor) * 2);

cvthash(2:result:'QASCII');

Return (xor+result);



/End-Free



P Calcxor E
Gatto
2011-08-03 10:36:20 UTC
Permalink
Post by Mauro Romeo
Post by Gatto
Post by Mauro Romeo
Post by Gatto
On 27 Lug, 16:50, "stefano[dot]tassi[at]dedanext[dot]it"
Post by stefano[dot]tassi[at]dedanext[dot]it
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
Per aggiungere i caratteri di fine riga in un file scritto nell'IFS
eval NomeVar = %trim(NomeVar) + x'0d0a'
Ma se devo operare con una variabile? Non posso fare NomeVar =
%trim(NomeVar) + x'Var2' (dove Var2 contiene i dati esadecimali)
perché giustamente mi esce il messaggio che i caratteri esadecimali
non sono corretti. Ho provato anche x(%trim(Var2)), sperando che
potesse avere un qualche senso, ma non va bene neanche quello... Per
forza! Ci ho pensato dopo: in questo caso 'x' dovrebbe essere un nome
di procedura.
Allora come posso fare? Non esiste una cosa simile a x'0d0a' da poter
utilizzare con una variabile in una eval? Se può servire il SO è a
V5R4
Grazie in anticipo
Marco
una variabile puo' contenere dati esadecimali, quindi il problema non
se una var di 2 byte
var2a = x'0d0a'
puoi concatenarla senza problemi
NomeVar = %trim(NomeVar) + var2a'
il tuo problema*forse* è popolarla correttamente.
forse la soluzione la trovi usando cvtch()
Praticamente io devo fare il contrario di cvtch che converte una
stringa alfanumerica in esadecimale: io ricevo una stringa esadecimale
e la devo convertire in una stringa alfanumerica.
Quindi in NomeVar devo aggiungere x'contenuto_di_Var2', e Var2
contiene '0d0a' (4 caratteri, non x'0d0a' che sono 2 caratteri), ma
potrebbe contenere qualsiasi altro valore esadecimale altrimenti
userei la tecnica che dici tu, e l'ho già usata in varie occasioni. E'
possibile?
Grazie
Marco
cvtch converte da alfanumerico a esadecimale.
cvthc da esadecimale ad alfanumerico.
Mauro Romeo
Sì, dopo mi sono accorto che c'era anche l'altro. Sto facendo un
programma per provare l'API, ma convertendo da esadecimale a
Si è verificato un errore di dominio nella funzione
matematica.
Errore di funzione. C2M3001 non monitorato da UCOM267 all'istruzione
ad
alto livello 0000000032, istruzione
X'0000'.
La cosa strana è che sembra che le 2 funzioni funzionino al contrario
di come dovrebbe essere: cvthc mi converte da alfanumerico a numerico,
cvtch mi da l'errore.
Adesso non riesco a fare delle prove, ma andrò a verificare e magari
prendo spunto dall'esempio che ha postato Obelix.
Intanto grazie
Marco
Ti posto una routine che mi funziona. Ci sono varie cose tra cui la
conversione.
Vedi se ti serve. A me funziona sia con 5.4 che con 6.1 release
precedenti non le ho provate.
Mauro Romeo
//----------------------------------------------------------------------------//
// Calcolo xor e caratteri risultanti
// Risponde con un campo di 3 caratteri
// il primo è xor risultante
// i seguenti 2 la rappresentazione caratteri di ogni
// semibyte in rappresentazione ascii
P Calcxor B
D Calcxor PI 3A
D campodacontr 300A Const
*
*.. Chiamata conversione ASCII per controllo hash
D Cvthash PR ExtPgm('QDCXLATE')
D datalenght 5P 0 Const
D daticonvprm 2A
D tabconv 10A Const
* Campi di lavoro
D cx S 5I 0
D result S 2A
D xor S 1A Inz(x'55')
* Conversione da ex a carattere
D cvthc PR EXTPROC('cvthc')
D tgt 32767 OPTIONS(*VARSIZE)
D src 16383 OPTIONS(*VARSIZE)
D CONST
D tgt_bytes 10I 0 VALUE
/Free
For cx = 1 to %Len(%Trim(campodacontr));
xor = %BitXor(xor:%Subst(campodacontr:cx:1));
EndFor;
cvthc(result:xor:%LEN(xor) * 2);
cvthash(2:result:'QASCII');
Return (xor+result);
/End-Free
P Calcxor E
Grazie per la procedura che mi hai postato. Mi sa che questa settimana
non riesco a provarla, mi tocca rimandare tutto a settembre.

Ciao
Marco
Obelix-it
2011-07-28 08:05:44 UTC
Permalink
Post by Gatto
Praticamente io devo fare il contrario di cvtch che converte una
stringa alfanumerica in esadecimale: io ricevo una stringa esadecimale
e la devo convertire in una stringa alfanumerica.
Quindi in NomeVar devo aggiungere x'contenuto_di_Var2', e Var2
contiene '0d0a' (4 caratteri, non x'0d0a' che sono 2 caratteri), ma
potrebbe contenere qualsiasi altro valore esadecimale altrimenti
userei la tecnica che dici tu, e l'ho già usata in varie occasioni. E'
possibile?
Prendi spunto da queste...

d Hex2String pr 128 Varying
d Hex 256 Value Varying

//********************************
p Hex2String b Export

d Hex2String pi 128 Varying
d Hex 256 Value Varying

d RetString s 128 Varying
d x s 3u 0
d DecValue s 3i 0
D HexVal s 15 Inz('123456789ABCDEF')

D CharCode ds
d CharValue 3u 0 Overlay(CharCode:1)

/free
for x = 1 to %len(Hex) by 2 ;
CharValue = %Scan(%Subst(Hex:x:1):HexVal) * 16 +
%Scan(%Subst(Hex:x+1:1):HexVal) ;
RetString += CharCode ;
EndFor;

Return RetString ;

/end-free
p Hex2String e
Gatto
2011-07-29 13:31:51 UTC
Permalink
Post by Obelix-it
Post by Gatto
Praticamente io devo fare il contrario di cvtch che converte una
stringa alfanumerica in esadecimale: io ricevo una stringa esadecimale
e la devo convertire in una stringa alfanumerica.
Quindi in NomeVar devo aggiungere x'contenuto_di_Var2', e Var2
contiene '0d0a' (4 caratteri, non x'0d0a' che sono 2 caratteri), ma
potrebbe contenere qualsiasi altro valore esadecimale altrimenti
userei la tecnica che dici tu, e l'ho già usata in varie occasioni. E'
possibile?
Prendi spunto da queste...
      d Hex2String      pr           128    Varying
      d   Hex                        256    Value Varying
       //********************************
      p Hex2String      b                   Export
      d Hex2String      pi           128    Varying
      d   Hex                        256    Value Varying
      d RetString       s            128    Varying
      d x               s              3u 0
      d DecValue        s              3i 0
      D HexVal          s             15    Inz('123456789ABCDEF')
      D  CharCode       ds
      d   CharValue                    3u 0 Overlay(CharCode:1)
       /free
        for x = 1 to %len(Hex) by 2 ;
            CharValue = %Scan(%Subst(Hex:x:1):HexVal) * 16 +
                        %Scan(%Subst(Hex:x+1:1):HexVal) ;
            RetString += CharCode ;
        EndFor;
        Return RetString ;
       /end-free
      p Hex2String      e
Grazie dell'esempio, appena posso lo provo.

Ciao
Marco
Danilo Cussini
2011-07-27 15:05:40 UTC
Permalink
Post by Gatto
Esiste un modo per convertire una stringa contenente dati esadecimali
in una stringa alfanumerica in RPGLE?
In SQL si fa
SELECT CHAR(X'c1c2c3') FROM SYSIBM/SYSDUMMY
Prova ad usarla dentro una istruzione SET
EXEC SQL SET :char = CHAR(X':hex');
I.T.
2011-07-29 15:34:14 UTC
Permalink
Post by Danilo Cussini
In SQL si fa
Prova ad usarla dentro una istruzione SET
EXEC SQL SET :char = CHAR(X':hex');
e il suo contrario?
ho questo problema;

estrarre un numero Packed da un tracciato non formattato
vedi esempio:
_________1_________0_________3_________4
______________Î310301
444444444444444000712FFFFFF44444444444
00000000000000000161F31030100000000000

questo spezzone di record da pos. 16 a 21 contiene il numero 17612+
con RPG è uno scherzo basta mppare correttamante il campo,
ma con SQL come faccio a dirgli di estrarmi un decimal(11 0) ??
qualcosa del tipo

cast(substr(campo, 16, 6) as decimal (11)) as mionumero
( l'istruzione non da errore ma il campo rimane inutilizzabile)

dal momento che SQL è il miglior manipolatore di dati che conosco,
sicuramente è solo la mia mente arrugginita a impedirmi di convertrlo
in un campo decimale utilizzabile.

o no?

I.T.
Fabio Terrazzin
2011-07-29 16:04:20 UTC
Permalink
Post by I.T.
Post by Danilo Cussini
In SQL si fa
Prova ad usarla dentro una istruzione SET
EXEC SQL SET :char = CHAR(X':hex');
e il suo contrario?
ho questo problema;
estrarre un numero Packed da un tracciato non formattato
_________1_________0_________3_________4
______________Î310301
444444444444444000712FFFFFF44444444444
00000000000000000161F31030100000000000
questo spezzone di record da pos. 16 a 21 contiene il numero 17612+
con RPG è uno scherzo basta mppare correttamante il campo,
ma con SQL come faccio a dirgli di estrarmi un decimal(11 0) ??
qualcosa del tipo
cast(substr(campo, 16, 6) as decimal (11)) as mionumero
( l'istruzione non da errore ma il campo rimane inutilizzabile)
dal momento che SQL è il miglior manipolatore di dati che conosco,
sicuramente è solo la mia mente arrugginita a impedirmi di convertrlo
in un campo decimale utilizzabile.
o no?
I.T.
se fai:

select hex(campone) from file

lo vedi in questo modo:

....00000176112F....

a questo punto con dec(substr(hex(campone), <from>, <len>), 11, 0)
--
Bye
Fabio Terrazzin
Obelix@Home
2011-07-31 20:16:12 UTC
Permalink
Post by I.T.
estrarre un numero Packed da un tracciato non formattato
In ordine:

1) uccidere chi lo ha fatto

2) eliminare il file e passare ad un formato civile...
Obelix-it
2011-08-01 07:44:15 UTC
Permalink
Post by I.T.
dal momento che SQL è il miglior manipolatore di dati che conosco,
Hai conoscenze limitate (c)...
Danilo Cussini
2011-08-02 07:06:36 UTC
Permalink
Post by I.T.
Post by Danilo Cussini
In SQL si fa
Prova ad usarla dentro una istruzione SET
EXEC SQL SET :char = CHAR(X':hex');
e il suo contrario?
ho questo problema;
estrarre un numero Packed da un tracciato non formattato
_________1_________0_________3_________4
______________Î310301
444444444444444000712FFFFFF44444444444
00000000000000000161F31030100000000000
questo spezzone di record da pos. 16 a 21 contiene il numero 17612+
con RPG è uno scherzo basta mppare correttamante il campo,
ma con SQL come faccio a dirgli di estrarmi un decimal(11 0) ??
Se il numero è sempre positivo
SELECT DEC(LEFT(HEX(SUBSTR(colonna, 16, 6)), 11)) FROM ...
Se invece il numero può essere anche negativo bisogna incapsulare il tutto dentro una CASE per testare l'esistenza di una 'D' in posizione 12.
CRPence
2011-08-05 21:55:11 UTC
Permalink
Post by I.T.
<<SNIP>>
ho questo problema;
estrarre un numero Packed da un tracciato non formattato
____+____1____+____2____+____3____+____4
_______________......310301___________
444444444444444000712FFFFFF44444444444
00000000000000000161F31030100000000000
questo spezzone di record da pos. 16 a 21 contiene il numero 17612+
con RPG è uno scherzo basta mappare correttamente il campo, ma con
SQL come faccio a dirgli di estrarmi un decimal(11 0) ?? qualcosa
del tipo
cast(substr(campo, 16, 6) as decimal (11)) as mionumero
( l'istruzione non da errore ma il campo rimane inutilizzabile)
dal momento che SQL è il miglior manipolatore di dati che conosco,
sicuramente è solo la mia mente arrugginita a impedirmi di convertrlo
in un campo decimale utilizzabile.
o no?
All data in SQL, every "value", has a type. Thus there is no means
to take a value without a type, then assign a type :-( by casting. So
SQL is not very good for the given example, except when deferred to a
UDF when acceptable. If the data is in a row, then the best effect is
achieved by properly describing that portion of data, a column\field, as
DECIMAL data.

I hoped that with the BINARY and VARBINARY data types the capability
was going to arrive to cast any binary string of data directly into a
typed-value, but unfortunately that did not happen :-( There are very
few casting capabilities using the binary type. The closest capability
to get untyped data from SQL is by using the HEX() character string that
represents the data.

<code>

cast( left(hex(substr(campo, 16, 6)), 11 ) * case
when right(hex(substr(campo, 16, 6)), 1) IN ('D', 'B')
then -1 /* 0xD & 0xB as nibbles represent BCD negative */
else 1 /* 0xA, 0xC, 0xE, 0xF nibbles are BCD positive */
/* this logic ignores bad decimal data for invalid sign */
end
as decimal(11) )

</code>

http://archive.midrange.com/midrange-l/200808/msg00463.html
http://archive.midrange.com/midrange-l/201005/msg00198.html
http://archive.midrange.com/midrange-l/201005/msg00207.html

<code>

create table qtemp/rl38 (r char(38))
;

insert into qtemp/rl38 values
('123456789012345' concat x'00000176112F')
,('...............' concat x'00000176112D')
;

create function s2d (s varchar(16))
returns dec(31)
language sql
return left( hex( s ), int(length(s)*2-1) )
* case when right( hex( s ), 1 ) in ('D', 'B') then -1
else 1
end /* implicit char->dec per multiplication */

</code>

<code>

select cast( s2d( substr( r , 16, 6 ) ) as decimal(11) ) as D11
from qtemp/rl38

D11
176.112
176.112-
******** End of data ********

</code>

Regards, Chuck

Loading...