Wytłumaczę krótko sytuację i przejdę do pytania.
Mam aplikację, która zapisuje / odczytuje niektóre dane do urządzenia (karty). Oto przykładowy kod.
Najpierw użytkownik wprowadza ciąg szesnastkowy, powiedz: "00000000000000000000AABBEEAABBEE
"(Powinno to być 16 bajtów).
Teraz, aby pisać dane te do karty są konwertowane na tablicę bajtową.
for(int i=0,m=0; i < size; i+=2,m++)
{
char ch1, ch2;
ch1=(char)str[i]; // str is hex string
ch2=(char)str[i+1];
int dig1, dig2;
if(isdigit(ch1)) dig1 = ch1 - "0";
else if(ch1>="A" && ch1<="F") dig1 = ch1 - "A" + 10;
else if(ch1>="a" && ch1<="f") dig1 = ch1 - "a" + 10;
if(isdigit(ch2)) dig2 = ch2 - "0";
else if(ch2>="A" && ch2<="F") dig2 = ch2 - "A" + 10;
else if(ch2>="a" && ch2<="f") dig2 = ch2 - "a" + 10;
array1[m] = (char)(dig1*16 + dig2); // output byte array
}
Teraz ta tablica bajtów jest wysyłana do urządzenia, w prosty sposób:
unsigned char sendBuff[16];
for(int i=0;i<16;i++)
sendBuff[i]=array1[i];
I powiedz, powiedz, polecenie wysyłania Send(sendBuff, 16)
;
Czytanie jest również łatwe, nazywamy to Receive(receiveBuffer);
Teraz receiveBuffer
zawiera tablicę bajtów, którą zapisaliśmy. Konwertujemy je z powrotem na hex:
for(k=0;k<16;k++)
{
data[k*2]=hexval[((receiveBuffer[k]>>4)&0xF)];
data[(k*2)+1]=hexval[receiveBuffer[k]&0x0F];
}
I teraz data
zawiera: "00000000000000000000AABBEEAABBEE
"
Ostatnim razem zadawałem podobne pytania, które padły ofiarąpodejrzenie / zainteresowanie używanym formatem bajtów, endianizmem itp. Moje pytanie brzmi: czy można użyć powyższej metody? Czy jest to jakiś ustalony format? Czy mogę spodziewać się problemów z endianizmem?
Odpowiedzi:
0 dla odpowiedzi № 1Rzeczywiste cyfry heksadecymalne są interpretowane wielowymiarowo, ale kod wygląda jak endianness-neutralny i powinien działać bez względu na endianness twojego komputera.