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 der int 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

InformationsquelleAutor frazras | 2012-11-01
Schreibe einen Kommentar