PDA

Visualizza la versione completa : [C] Char e valori esadecimali


nemo74na
04-01-2005, 17:41
Salve,
ho questa stringa: "L4TON"
Tale stringa corrisponde al valore esadecimale: 00411138

So che in C ad ogni carattare è associato un byte in memoria.
La mia domanda è questa:
Come faccio a capire se la stringa è effettivamente quel valore esadecimale??

Grazie

netarrow
04-01-2005, 19:27
:master: forse così:



#include <stdio.h>

int main() {
char* str = "L4TON";

printf("%x\n", str);

return 0;
}


:ciauz:

edriv
04-01-2005, 19:58
Questo credo che sia impossibile (printf() si aspetta un numero...non un puntatore)

Puoi fare un ciclo e scrivere il codice carattere per carattere con printf()e dovrebbe andare...

Nota:
Con una stringa di 5 caratteri non dovresti avere 10 caratteri esadecimali (1 byte = 256 = 16*16 = 2 cifre hex) ?
E con L4TON come la metti?
L non è sicuramente 00...

boh

netarrow
04-01-2005, 20:04
il C non si aspetta niente, puoi trattare qualsiasi dato come vuoi.
Facendo il cast in intero cmq il risultato non cambia.

Inoltre non ho capito come si fa a convertire una stringa in esadecimale... prendiamo "Ciao", si calcola il decimale di c, i, a, o poi? ho 4 interi decimali, li sommo e poi converto? :confused:

Giusto per curiosità, a me dice 420020 per L4TON, risulta anche a voi?

:ciauz:

nemo74na
05-01-2005, 09:10
come fa ad uscire 420020 per L4TON???
come'è il procedimento?

edriv
05-01-2005, 12:36
Originariamente inviato da netarrow
il C non si aspetta niente, puoi trattare qualsiasi dato come vuoi.
Facendo il cast in intero cmq il risultato non cambia.

Inoltre non ho capito come si fa a convertire una stringa in esadecimale... prendiamo "Ciao", si calcola il decimale di c, i, a, o poi? ho 4 interi decimali, li sommo e poi converto? :confused:

Giusto per curiosità, a me dice 420020 per L4TON, risulta anche a voi?

:ciauz:


Sommando i 4 interi daresti luogo a delle ambiguità!
Esempio:
CAB = 67 + 65 + 66 = 198
ADA = 65 + 68 + 65 = 198!!

Per evitare queste ambiguità bisognerebbe "unire" semplicemente i codici esadecimali!
Esempio:
CIAO = 0x43; 0x49; 0x41; 0x4F
codice(CIAO) = 0x4349414F
che si ottiene facendo:
0x43 * 0x1000000 + 0x49 * 0x10000 + 0x41 * 0x100 + 0x4F * 0x1 =
0x43000000 +
0x490000 +
0x4100 +
0x4F =
0x4349434F;



Quindi numero lettere = numero cifre esadecimali / 2

Almeno secondo me...

netarrow
05-01-2005, 12:53
Originariamente inviato da edriv


Sommando i 4 interi daresti luogo a delle ambiguità!
Esempio:
CAB = 67 + 65 + 66 = 198
ADA = 65 + 68 + 65 = 198!!

Per evitare queste ambiguità bisognerebbe "unire" semplicemente i codici esadecimali!
Esempio:
CIAO = 0x43; 0x49; 0x41; 0x4F
codice(CIAO) = 0x4349414F
che si ottiene facendo:
0x43 * 0x1000000 + 0x49 * 0x10000 + 0x41 * 0x100 + 0x4F * 0x1 =
0x43000000 +
0x490000 +
0x4100 +
0x4F =
0x4349434F;



Quindi numero lettere = numero cifre esadecimali / 2

Almeno secondo me...

si potrebbe essere così... aspettaimo nemo74na che confermi.



come fa ad uscire 420020 per L4TON???
come'è il procedimento?


non ho fatto un procedimento, ho fatto un cast in int e ho stampato il nu8mero in formato esedecimale con %x, sarà snbagliato, la proposta di endrive mi sembra la più logica.

:ciauz:

pprllo
05-01-2005, 12:56
Logico. Infatti:
1 cifra esadecimale = 1 nibble.
1 lettera = 1 byte = 2 nibbles.

Comunque, per la conversione, una funzione in pseudo-codice:


string ToHex(int Dec)
{
string hex;
int cifra;

while (Dec > 0)
{
cifra = Dec % 16;

if (cifra < 10) hex = (char)(48 + cifra) + hex;
else hex = (char)(55 + cifra) + hex;

Dec = Dec / 16;
}

return hex;
}


Dato il valore decimale del carattere ascii da te cercato (dovrebbe bastare un semplice cast a int) questa funzione ti tira fuori il valore esadecimale a 2 cifre che lo rappresenta.

P.S. Questa è una funzione fatta apposta, forse (di sicuro) il C ha già qualche funzione predisposta.

nemo74na
05-01-2005, 14:06
E se avessi la stringa "L4TON" con le virgolette?
Come la mettiamo?

pprllo
05-01-2005, 14:30
In che senso "come la mettiamo" ? Le virgolette sono anch'esse dei caratteri ascii e come tali si possono trasformare in int e dare in pasto ad una funzione come quella che ho scritto.

Loading