View Full Version : [C#] Conversione ASCII in string
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
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... ;)
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)
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 ?
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 ?
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
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.