PDA

View Full Version : [C#] Conversione ASCII in string


Napalm
07-11-2008, 11:48
Ciao a tutti,

io ho una stringa che rappresenta una frase in esadecimale (abcdefg) "006162636465666700000000" più altri caratteri (gli "00"). Il mio problema è di convertire quella stringa in una stringa "leggibile" da parte dell'utente ma non ho capito come fare.
Grazie

NapalM

MarcoGG
07-11-2008, 15:13
string input = "006162636465666700000000";
StringBuilder output = new StringBuilder("");
for (int i = 0; i < input.Length-1; i+=2)
{
Int32 n = Convert.ToInt32(input.Substring(i, 2), 16);
if (n != 0)
{
char C = Convert.ToChar(n);
output.Append(C);
}
}
MessageBox.Show(output.ToString());

Prova... ;)

Napalm
07-11-2008, 18:13
Grazie mille :)

NapalM

MarcoGG
07-11-2008, 22:02
Grazie mille :)

NapalM

:cool:

Samb1985
02-05-2009, 11:12
a me serve il contrario...data una stringa ASCII es. "Hello" devo ottenere una stringa contenente i valori in esadecimale dei singoli caratteri "48464C4C4F". Come posso farlo ?

!k-0t1c!
02-05-2009, 13:28
a me serve il contrario...data una stringa ASCII es. "Hello" devo ottenere una stringa contenente i valori in esadecimale dei singoli caratteri "48464C4C4F". Come posso farlo ?
Così:

System.Text.Encoding.ASCII.GetBytes(TUA_STRINGA)

Samb1985
02-05-2009, 14:29
Così:

System.Text.Encoding.ASCII.GetBytes(TUA_STRINGA)


L'ho appena provato e restituisce 7269767679 invece di 48464C4C4F, come mai ? (TUA_STRINGA è HELLO)

gugoXX
02-05-2009, 14:51
L'ho appena provato e restituisce 7269767679 invece di 48464C4C4F, come mai ? (TUA_STRINGA è HELLO)

72d = 0x48
69d = 0x46
76d = 0x4C

Stai stampando i bytes in decimale. Stampali in esadecimale e ti verra' fuori il risultato

Samb1985
02-05-2009, 15:01
72d = 0x48
69d = 0x46
76d = 0x4C

Stai stampando i bytes in decimale. Stampali in esadecimale e ti verra' fuori il risultato

come li converto in esadecimale ? qual'è il comando ?

MarcoGG
02-05-2009, 15:45
a me serve il contrario...data una stringa ASCII es. "Hello" devo ottenere una stringa contenente i valori in esadecimale dei singoli caratteri "48464C4C4F". Come posso farlo ?

Sicuro che non sia "48454C4C4F" ?

Comunque metodi ce ne sono diversi, come questo :

string input = "HELLO";
StringBuilder stringaHex = new StringBuilder("");
byte[] caratteri = System.Text.Encoding.ASCII.GetBytes(input);
foreach (char ch in caratteri)
{
string h = String.Format("{0:X}", Convert.ToInt32(ch));
stringaHex.Append(h);
}
MessageBox.Show(stringaHex.ToString());

o questo :

string input = "HELLO";
StringBuilder stringaHex = new StringBuilder();
foreach (char c in input)
{
stringaHex.Append(Convert.ToString((int)c, 16 ));
}
MessageBox.Show(stringaHex.ToString());

... ;)

Samb1985
03-05-2009, 09:26
Sicuro che non sia "48454C4C4F" ?

Comunque metodi ce ne sono diversi, come questo :

string input = "HELLO";
StringBuilder stringaHex = new StringBuilder("");
byte[] caratteri = System.Text.Encoding.ASCII.GetBytes(input);
foreach (char ch in caratteri)
{
string h = String.Format("{0:X}", Convert.ToInt32(ch));
stringaHex.Append(h);
}
MessageBox.Show(stringaHex.ToString());

o questo :

string input = "HELLO";
StringBuilder stringaHex = new StringBuilder();
foreach (char c in input)
{
stringaHex.Append(Convert.ToString((int)c, 16 ));
}
MessageBox.Show(stringaHex.ToString());

... ;)

Sto cercando di utilizzare il secondo e adattarlo al mio caso.
Invece di mettere il valore in stringaHex devo mettere il valore esadecimale di ogni carattere in una variabile byte txBuff[]
Qual'è il codice per inserire ogni valore esadecimale di c e inserirlo nel vettore di tipo byte ?

MarcoGG
03-05-2009, 12:42
Sto cercando di utilizzare il secondo e adattarlo al mio caso.
Invece di mettere il valore in stringaHex devo mettere il valore esadecimale di ogni carattere in una variabile byte txBuff[]
Qual'è il codice per inserire ogni valore esadecimale di c e inserirlo nel vettore di tipo byte ?

string input = "HELLO";
byte[] txBuff = new byte[input.Length];
string hexChar;
for(int i=0;i<input.Length;i++)
{
hexChar = Convert.ToString((int)input[i], 16);
txBuff[i] = byte.Parse(hexChar, System.Globalization.NumberStyles.HexNumber);
}

;)

!k-0t1c!
04-05-2009, 23:56
string input = "HELLO";
byte[] txBuff = new byte[input.Length];
string hexChar;
for(int i=0;i<input.Length;i++)
{
hexChar = Convert.ToString((int)input[i], 16);
txBuff[i] = byte.Parse(hexChar, System.Globalization.NumberStyles.HexNumber);
}

;)
Il risultato è lo stesso che fare

byte[] txBuff = System.Text.Encoding.ASCII.GetBytes(input);

ma con l'aggiunta gratuita di un overhead enorme.
Non ha senso parlare di bytes in formato decimale o esadecimale tranne che se uno li stampa. E per stamparli il modo più veloce e pulito è fare

foreach(var b in txBuff) Console.Write(b.ToString("X2")); //stampa esattamente quello che ti aspetteresti

MarcoGG
05-05-2009, 07:48
Il risultato è lo stesso che fare

byte[] txBuff = System.Text.Encoding.ASCII.GetBytes(input);

ma con l'aggiunta gratuita di un overhead enorme.
Non ha senso parlare di bytes in formato decimale o esadecimale tranne che se uno li stampa. E per stamparli il modo più veloce e pulito è fare

foreach(var b in txBuff) Console.Write(b.ToString("X2")); //stampa esattamente quello che ti aspetteresti

Sì, grazie, lo so anch'io.
La richiesta di Samb1985 era espressamente questa :
"Qual'è il codice per inserire ogni valore esadecimale di c e inserirlo nel vettore di tipo byte ?"
A domanda ho risposto, ipotizzando che, per qualche oscuro motivo dovesse prima avere i valori esadecimali di ogni carattere, uno per uno, e poi inserirli nell'array di Byte.

Samb1985
05-05-2009, 08:20
Vi ringrazio entrambi per l'auito. Sto risolvendo.
Ho bisogno dei singoli valori perchè essendo un comando per un dispositivo collegato via usb, i valori che ottenuti dalla stringa sono una parte variabile del vettore dalla posizione 11 in poi, mentre le prime posizioni sono valori fissi.

!k-0t1c!
05-05-2009, 09:39
In tal caso ti consiglio di usare questo sistema:

byte[] datiFissi = ...;
datiFissi.Concat(System.Text.Encoding.ASCII.GetBytes(TUA_STRINGA)).ToArray()

La cosa è fattibile solo se stai usando C# 3 (e quindi se stai compilando per .NET 3.5) e richiede la direttiva

using System.Linq;

ma se questo è un opzione, allora io trovo che quel modo di risolvere il problema sia decisamente il più elegante.