Konvertieren eines byte-array in ein int array in C
Ich habe einige code unten sein soll Konvertierung eines C (Arduino) 8-bit-byte-array auf ein 16-bit-int-array, aber es scheint nur teilweise zu funktionieren. Ich bin mir nicht sicher, was ich falsch mache.
Wird das ByteArray im little endian-byte-Reihenfolge. Wie konvertiere ich es mit einem int-Datentyp (zwei bytes pro enty) array?
In Laien ' s Begriffe, die ich Zusammenführen möchten, die alle zwei bytes.
Derzeit ist es die Ausgabe für ein Eingabe-BYTE-ARRAY von: {0x10, 0x00, 0x00, 0x00, 0x30, 0x00}
. Der output INT-ARRAY ist: {1,0,0}
. Die Ausgabe sollte sein ein INT-ARRAY ist: {1,0,3}
.
Den code unten ist das, was ich derzeit habe:
Schrieb ich diese Funktion basiert auf eine Lösung von Stack Overflow Frage Konvertieren von Byte in ein C-array als Long.
Ich habe auch diese Lösung basiert auf dem gleichen code, der funktioniert gut für byte-array zu lang (32-bit) array http://pastebin.com/TQzyTU2j
.
/**
* Convert the retrieved bytes into a set of 16 bit ints
**/
int * byteA2IntA(byte * byte_slice, int sizeOfB, int * ret_array){
//Variable that stores the addressed int to be stored in SRAM
int currentInt;
int sizeOfI = sizeOfB / 2;
if(sizeOfB % 2 != 0) ++sizeOfI;
for(int i = 0; i < sizeOfB; i+=2){
currentInt = 0;
if(byte_slice[i]=='\0') {
break;
}
if(i + 1 < sizeOfB)
currentInt = (currentInt << 8) + byte_slice[i+1];
currentInt = (currentInt << 8) + byte_slice[i+0];
*ret_array = currentInt;
ret_array++;
}
//Pointer to the return array in the parent scope.
return ret_array;
}
- Warum gehst du nicht einfach casten zu int* der Zeiger auf die Eingabe-array?
- Was meinst du mit "teilweise" zu arbeiten? Was funktioniert, was nicht?
int
sein könnte 4 bytes, und er ist die Konvertierung von 2 bytes zu einem int.- was ist es? die Eingabe ist nur ein stream von bytes, nicht eine komplexere Struktur haben könnte gehabt haben, alignment-Probleme
- Wie etwa kurz * byteA2IntA(byte * byte_slice) { return (short *)byte_slice;}
- Könnte funktionieren, wenn es kurz ist 2 bytes und endianness erlaubt.
- Es war ein temp Gehirn Runden ... - jedenfalls die byte-Reihenfolge würde dazu führen, dass portabliity Probleme.
- aa, ich sehe, was du meinst. In diesem Fall mit int ist wohl nicht die beste Wahl-und 16-bit-Typ würde besser passen (so etwas wie AkiSuihkonen vorgeschlagen)
- Portabilität Probleme werden die gleichen irgendeiner Weise
- ja, der code ist noch nicht bereit, geliefert werden ... @kältepack
- Natürlich ist es das nicht, sonst würde er nicht Fragen. 😉
- Man könnte das erstellen der 16-bit-Wert im network-byte-order und verwenden Sie dann
ntohs()
zum Auffüllen derint
array. - Wenn
sizeOfB
- id ungerade ist, läuft in UB für die Letzte Schleife. - Duplikat von stackoverflow.com/questions/11295728/...?
- Ich habe aktualisiert die Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist der Sinn dieser Zeile?
Hier
currentInt
ist immer0
und0 << 8 = 0
.Auch, was Sie tun ist, für jedes paar von
bytes
(ich nenne Sie maluint8_t
von jetzt auf), pack dir einint
(ich nenne es maluint16_t
ab sofort) wie folgt:uint8_t
uint8_t
Ist es wirklich das, was Sie wollen?
Angenommen, Sie haben
byte_slice[] = {1, 2}
packen Sie ein 16-bit-integer mit dem Wert 513 (2<<8 + 1
)!Außerdem müssen Sie nicht brauchen, um wieder den Zeiger auf das array der
uint16_t
als der Anrufer hat schon, sofern es um die Funktion.Wenn Sie die Rückkehr Ihrer Funktion, wie Joachim sagte, Sie bekommen einen Zeiger ausgehend von einer position der
uint16_t
array zurück, das ist nicht position[0]
.Vincenzo hat einen Punkt (oder zwei), müssen Sie sich klar, was Sie zu tun versuchen;
Kombinieren zwei bytes zu einem 16-bit int, ein byte MSB und ein byte-LSB
int16 result = (byteMSB << 8) | byteLSB;
Konvertiert ein array von bytes in 16-bit -
Kopieren eines Arrays von Daten in ein anderes
Wird (wahrscheinlich, Plattform/compiler-abhängig) die gleiche Wirkung haben wie mein 1. Beispiel.
Außerdem hüten Sie sich vor der Verwendung von ints als die vermuten lässt, dass vorzeichenbehaftete Werte verwenden-Einheiten, sicherer und wahrscheinlich auch schneller.
Das problem ist wahrscheinlich, dass Sie erhöhen
ret_array
und geben es dann zurück. Wenn Sie es zurück, es wird an einem Ort außerhalb der Ziel-array.Speichern Sie den Zeiger an den Anfang der Funktion, und verwenden diesen Zeiger, statt.
Überlegen Sie sich eine Struktur. Dies ist ein hack, aber.
Aus der Spitze von meinem Kopf würde es so Aussehen.
So, in Ihrem Fall würden Sie schreiben:
Du musst gehen durch einen Zeiger zu casten, obwohl: