Ciao a tutti.
Ho un'applicazione che legge da un CEdit una sequenza di bytes e li deve salvare in un vettore di unsigned char.
Per intenderci nel CEdit ho una stringa di questo genere:
1A 23 FF 1C 2B 4F A1
e devo ottenere un vettore di unsigned char cosi' fatto:
{0x1A, 0x23, 0xFF, 0x1C, 0x2B, 0x4F, 0xA1}
Per farlo utilizzo questo codice:
codice:
char getHexFromCString(CString in) {
unsigned char x = in[0]-48;
unsigned char temp = (unsigned char) in[1];
x = x << 4;
if ( temp>=65 && temp<=70) {
switch ( temp ) {
case 65: x = x | 0x0A; break;
case 66: x = x | 0x0B; break;
case 67: x = x | 0x0C; break;
case 68: x = x | 0x0D; break;
case 69: x = x | 0x0E; break;
case 70: x = x | 0x0F; break;
}
}
else {
temp = 0x0F & (temp - 48);
x = x | temp;
}
return x;
}
void CTestDlg::OnBnClickedSendBtn() {
unsigned char payload;
CEdit *sendEdit = (CEdit *)GetDlgItem(IDC_SEND);
CString str;
int lenPayload = 0;
if (sendEdit != NULL) {
CString m_msg;
sendEdit->GetWindowText(str);
// compongo il payload
int payloadPos=0;
lenPayload = 0;
for (int k=0; k<str.GetLength(); k++) {
char d = (char)str.GetAt(k);
if (d != ' ') {
m_msg = m_msg + d;
}
else {
try {
// char x = (m_msg[0]-48) * 16 + (m_msg[1]-48);
char x = getHexFromCString(m_msg);
payload[payloadPos] = x;
payloadPos++;
lenPayload++;
m_msg.Empty();
}
catch (...)
{
printf("Errore \n");
}
}
}
// salvo l'ultimo elemento
if (!m_msg.IsEmpty() && m_msg.GetLength()==2) {
try {
char last = getHexFromCString(m_msg);
payload[payloadPos] = last;
lenPayload++;
m_msg.Empty();
}
catch (...) {
printf("Errore \n");
}
}
}
}
che di per se funziona tranne per gli Hex che iniziano con una lettera.
Ad esempio FF me lo converte in 6F nel vettore di unsigned char, AA in 1A, BB in 2B e cosi' via.
Dove sbaglio? Qualcuno riesce a darmi una dritta?
Grazie e ciao
Sandro