View Full Version : [C++] conversione da unsigned char a string
ARGENTOVIVO81
19-12-2009, 17:09
Salve,
come faccio a trasformare una variabile unsigned char[] in string???
Ho provato con std::string s (reinterpret_cast<const char*> (nome variabile unsigned char), dimensione) ma appena eseguo il programma va in errore!!:cry:
Perseverance
19-12-2009, 17:25
Tu hai un vettore di char cioè un char[]. String ha un costruttore di tipo implicito quindi puoi direttamente dare il comando string frase(<vettore di char>) cioè:
char a[] = "ARGENTOVIVO81 blablabla";
string b(a);
ARGENTOVIVO81
19-12-2009, 17:39
char a[] è lo stesso di unsigned char a[]?????
perche' a me serve convertire unsigned char in string e non char....:mbe:
ARGENTOVIVO81
19-12-2009, 17:43
ho provato quanto mi hai detto..compare un errore "invalid conversion from "unsigned char*" to "const char*":rolleyes: :rolleyes:
Perseverance
19-12-2009, 17:57
castalo a char* e riprova come ti ho detto!
char a[] = "ARGENTOVIVO81 blablabla";
string b((char*)a);
ARGENTOVIVO81
19-12-2009, 18:28
adesso compila!!ma se mando in esecuzione il programma compare come errore "invalid next size (fast): 0x0804c140"e poi si interrompe!!:mbe:
ARGENTOVIVO81
19-12-2009, 18:36
puo' essere che è legato al fatto che all'inizio la funzione prende in input una stringa che trasformo in unsigned char con la seguente istruzione???
unsigned char Key [16];
string s;
memcpy (Key, s.c_str(),16);
Successivamente Key viene elaborata ed è questa che alla fine devo riconvertire in stringa...
Perseverance
19-12-2009, 18:37
Probabilmente devi appendere al char[] il /0 che indica la fine!
ARGENTOVIVO81
19-12-2009, 18:51
scusa la mia poca esperienza, come faccio ad inserire /0 che indica la fine??
dovrei fare:
Key[17]= '/0'; ??
perche' se è cosi' mi da sempre lo stesso errore di invalid next size :cry: :cry:
C'è ualche motivo per cui hai dichiarato key unsigned char ? Ricordati che in key non ci possono essere byte pari a zero, altrimenti viene interpretato come il carattere di fine stringa.
ARGENTOVIVO81
19-12-2009, 19:11
Questa è la funzione che utilizzo:
string KeyExpansion(string s)
{
int i,j;
unsigned char temp[4],k;
memcpy (Key,s.c_str(),16);
for(i=0;i<Nk;i++)
{
RoundKey[i*4]=Key[i*4];
RoundKey[i*4+1]=Key[i*4+1];
RoundKey[i*4+2]=Key[i*4+2];
RoundKey[i*4+3]=Key[i*4+3];
}
while (i < (Nb * (Nr+1)))
{
for(j=0;j<4;j++)
{
temp[j]=RoundKey[(i-1) * 4 + j];
}
if (i % Nk == 0)
{
{
k = temp[0];
temp[0] = temp[1];
temp[1] = temp[2];
temp[2] = temp[3];
temp[3] = k;
}
{
temp[0]=getSBoxValue(temp[0]);
temp[1]=getSBoxValue(temp[1]);
temp[2]=getSBoxValue(temp[2]);
temp[3]=getSBoxValue(temp[3]);
}
temp[0] = temp[0] ^ Rcon[i/Nk];
}
RoundKey[i*4+0] = RoundKey[(i-Nk)*4+0] ^ temp[0];
RoundKey[i*4+1] = RoundKey[(i-Nk)*4+1] ^ temp[1];
RoundKey[i*4+2] = RoundKey[(i-Nk)*4+2] ^ temp[2];
RoundKey[i*4+3] = RoundKey[(i-Nk)*4+3] ^ temp[3];
i++;
}
string b((char*)RoundKey);
}
RoundKey è definita come unsigned char RoundKey[44], mentre Key come unsigned char Key[16]
Senza l'struzione :
string b((char*)RoundKey);
il programma gira, appena la inserisco compare l'errore free() invalid size fast:help: :help:
Manca il carattere di fine stringa. Quello è fuori dubbio. Devi quindi dichiarare il vettore di 17 elementi invece di 16.
ARGENTOVIVO81
19-12-2009, 19:15
no...non c'è un motivo particolare per cui l'ho dichiarato unsigned char!!!Facendo la stampa a video ho comunque visto che non ci sono byte pari a zero...
ARGENTOVIVO81
19-12-2009, 19:16
Anche RoundKey lo devo dichiarare di 45 invece che di 44??
comunque gia' ho provato ma non capisco perche' l'errore persiste...
Vedendo il codice è solo RoundKey che viene passata alla stringa, allora devia aggiungere il carattere di fine stringa solo a quella.
ARGENTOVIVO81
19-12-2009, 19:59
Aggiungere il carattere di fine stringa significa solo dichiarare la variabile di 45 piuttosto che di 44???:rolleyes:
Questa è la funzione che utilizzo:
string KeyExpansion(string s)
{
int i,j;
unsigned char temp[4],k;
memcpy (Key,s.c_str(),16);
for(i=0;i<Nk;i++)
{
RoundKey[i*4]=Key[i*4];
RoundKey[i*4+1]=Key[i*4+1];
RoundKey[i*4+2]=Key[i*4+2];
RoundKey[i*4+3]=Key[i*4+3];
}
while (i < (Nb * (Nr+1)))
{
for(j=0;j<4;j++)
{
temp[j]=RoundKey[(i-1) * 4 + j];
}
if (i % Nk == 0)
{
{
k = temp[0];
temp[0] = temp[1];
temp[1] = temp[2];
temp[2] = temp[3];
temp[3] = k;
}
{
temp[0]=getSBoxValue(temp[0]);
temp[1]=getSBoxValue(temp[1]);
temp[2]=getSBoxValue(temp[2]);
temp[3]=getSBoxValue(temp[3]);
}
temp[0] = temp[0] ^ Rcon[i/Nk];
}
RoundKey[i*4+0] = RoundKey[(i-Nk)*4+0] ^ temp[0];
RoundKey[i*4+1] = RoundKey[(i-Nk)*4+1] ^ temp[1];
RoundKey[i*4+2] = RoundKey[(i-Nk)*4+2] ^ temp[2];
RoundKey[i*4+3] = RoundKey[(i-Nk)*4+3] ^ temp[3];
i++;
}
string b((char*)RoundKey);
}
RoundKey è definita come unsigned char RoundKey[44], mentre Key come unsigned char Key[16]
Senza l'struzione :
string b((char*)RoundKey);
il programma gira, appena la inserisco compare l'errore free() invalid size fast:help: :help:
Nagra? Ndx? Propongo un altro punto di vista: cosa vorresti che facesse la tua funzione "string b((char*)RoundKey);"?
ARGENTOVIVO81
19-12-2009, 20:27
vorrei solo copiare la variabile "RoundKey" nella stringa "b" in modo tale da potere passare "b" ad altre funzioni per essere elaborata!!:(
ARGENTOVIVO81
19-12-2009, 20:43
ho provato ad inserire il carattere di fine stringa, ma l'errore persiste!!!suggerimenti????:muro:
Ma sei obbligato ad usare un char*? Perchè non usare il nativo unsigned char*?
Scusa se mi intrometto, ma il tutto dipende dal "a che cosa mi serve la funzione"?
Cosa devono contenere le tue stringhe/array?
Sono effettivamente CARATTERI (e caratteri di parole "occidentali") oppure sono BYTE?
Se sono byte allora DEVI usare "unsigned char": il "char" infatti usa 7 bit per i "valore" e uno per il segno (anche se francamente non ho mai visto applicazioni con "char" negativo, salvo che non servisse il valore particolare "(char) -1").
Ciao,
Mr Hyde
Se sono byte allora DEVI usare "unsigned char": il "char" infatti usa 7 bit per i "valore" e uno per il segno (anche se francamente non ho mai visto applicazioni con "char" negativo, salvo che non servisse il valore particolare "(char) -1").
E' uguale, per quelle operazioni che fa non cambierebbe assolutamente niente ;)
Le devi ottenere una string, quindi una sequenza di char.
Il mio dubbio è proprio che sia concettualmente sbagliato l'utilizzo di string: se vuole esprimere una sequenza di byte IMHO è sbagliato usare "std::string".
Ciao,
Mr Hyde
Da quello che ho capito gli viene richiesta proprio una string per passarla ad una qualche funzione già esistente.
Black imp
24-12-2009, 02:29
Ad es.
static const unsigned int MaxStringSize = 16;
char name[MaxStringSize];
possibile soluzione:
per quanto riguarda quella istruzione: tra i costruttori di string non ce n'è uno che accetti unsigned char*. quindi il cast (char*) serve.
quello che puoi provare è questo:
static const unsigned int RoundKeySize = 44;
string b((char*)RoundKey, RoundKeySize);
oppure dichiari RoundKey di 45
static const unsigned int RoundKeySize = 45;
unsigned char RoundKey[RoundKeySize ];
e nel corpo della funzione assegni
RoundKey[RoundKeySize - 1] = 0;
è giusto anche
RoundKey[RoundKeySize - 1] = '/0';
a questo punto la tua istruzione è giusta così com'è cioè
string b((char*)RoundKey);
In sostanza o metti il terminatore nell'array di char e poi usi il costruttore di string senza indicare la lunghezza di caratteri validi oppure non lo metti e specifichi al costruttore quanti caratteri deve copiare.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.