Discussione:
Da hex a decimal
(troppo vecchio per rispondere)
ciccioalby123
2010-11-04 12:50:12 UTC
Permalink
Ciao a tutti, ho una necessità di questo tipo, peraltro non
impellente ma mi stuzzica la curiosità:
Ho un campo di 1 char che contiene in esadecimale un valore
numerico da "00" a "99", come potrei fare, in RPG , a convertirlo in
un numero ?

L'unica idea fattibile che ho trovato era fare 100 campi (una
array) , poi con BITON accendere i singoli bit poi fare una
comparazione e tenere l'indice dell'array ... ma mi sembra brutto fare
100 biton ...

Grazie a tutti.
Alberto
Obelix-it
2010-11-04 13:48:35 UTC
Permalink
Post by ciccioalby123
Ho un campo di 1 char che contiene in esadecimale un valore
numerico da "00" a "99", come potrei fare, in RPG , a convertirlo in
un numero ?
Magari c'e una maniera migliore, ma...

d MioCampo s 1 Inz(x'23')
d MioNumero s 2 0

d Para DS
d numero 3p 0
/free
Para = MioCampo + x'0F' ;
MioNumero = Numero /10 ;

funziona (MioNumero vale 23, o 99 o quel che vuoi...)
MarcoF
2010-11-04 15:26:22 UTC
Permalink
    Ciao a tutti, ho una necessità di questo tipo, peraltro non
    Ho un campo di 1 char che contiene in esadecimale un valore
numerico da "00" a "99", come potrei fare, in RPG , a convertirlo in
un numero ?
    L'unica idea fattibile che ho trovato era fare 100 campi (una
array) , poi con BITON accendere i singoli bit poi fare una
comparazione e tenere l'indice dell'array ... ma mi sembra brutto fare
100 biton ...
Grazie a tutti.
Alberto
Cioè se contiene il valore x'40' ottieni 64?
Danilo Cussini
2010-11-04 16:15:08 UTC
Permalink
    Ho un campo di 1 char che contiene in esadecimale un valore
numerico da "00" a "99", come potrei fare, in RPG , a convertirlo in
un numero ?
Trasformi il sorgente in SQLRPGLE e poi
EXEC SQL SET :n = HEX(:char1);
Dr.Ugo Gagliardelli
2010-11-05 08:07:07 UTC
Permalink
Post by ciccioalby123
Ciao a tutti, ho una necessità di questo tipo, peraltro non
Ho un campo di 1 char che contiene in esadecimale un valore
numerico da "00" a "99", come potrei fare, in RPG , a convertirlo in
un numero ?
L'unica idea fattibile che ho trovato era fare 100 campi (una
array) , poi con BITON accendere i singoli bit poi fare una
comparazione e tenere l'indice dell'array ... ma mi sembra brutto fare
100 biton ...
Grazie a tutti.
Alberto
Immagino che quando dici "esadecimale" tu intenda che contiene un valore
binario, in tal caso la cosa e' piuttosto semplice. Se utilizzi l'ILE,
basta ridefinire il campo, ad esempio:
D ds
D campochar 1A
D campobin 1I 0 overlay(campochar)

quando metti x'40' in campochar, campobin contiene il corrispondente
valore numerico 64.
Oppure lo puoi fare con i puntatori:
D campochar s 1A
D campobin s 1I 0 based(campochar_p)
C eval campochar_p = %addr(campochar)

ogni volta che modifichi campochar campobin conterra' il medesimo valore
rappresentato come valore decimale.

Se invece intendi che campochar contiene i valori da x'00' a x'99' dove
i valori che possono assumere i due nibbles sono compresi tra 0 e 9 la
cosa cambia un po', il sistema piu' rapido e' sempre quello della
ridefinizione del campo:
D ds
D campo 2A
D campochar 1A overlay(campo:1)
D camposegno 1A overlay(campo:2) inz(x'0F')
D campodec 3P 1 overlay(campo)

anche in questo caso ogni volta che modifichi campochar campodec
conterrà il valore numerico corrispondente secondo la rappresentazione
packed, ovvero il valore di campochar x'40' comporta che campo contenga
x'400F' quindi campodec conterrà il valore 40.0, se ti serve
trasformarlo in un intero, basta usare la bif %int(campodec).
--
Dr. Ugo Gagliardelli, Modena, Italy
Spaccamaroni andate a cagare/Spammers not welcome
Obelix-it
2010-11-05 09:48:05 UTC
Permalink
Post by Dr.Ugo Gagliardelli
D campodec 3P 1 overlay(campo)
Astuto!! Non avevo pensato al (3,1)...
ciccioalby123
2010-11-09 21:53:12 UTC
Permalink
Il 05/11/2010 9.07, Dr.Ugo Gagliardelli ha scritto:> D campodec                     3P 1   overlay(campo)
Astuto!! Non avevo pensato al (3,1)...
Grazie mille, funziona in tutti i modi suggeriti (naturalmente :-)
Loading...