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:
che di per se funziona tranne per gli Hex che iniziano con una lettera.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"); } } } }
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

Rispondi quotando