Andere nicht erklären, warum Ihre Code nicht funktioniert, so dass ich einen schnellen Stich darauf werfen:
memcpy(pshort , pchar + 1 , 1);
memcpy(pshort + 1, pchar , 1);
auf einen Zeiger Hinzufügen TYPE * p
den Zeiger in Schritten von sizeof(TYPE)
bewegt (also es zeigt auf das nächste Element, denken Sie daran, das ist nur definiert wenn innerhalb ein Array). Also während pchar + 1
korrekt ist, ist pshort + 1
nicht (wie es die nächste short
adressiert).
aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
Errr .... die rechte Seite ist in mehr als einer Hinsicht gebrochen. Erstens, *(pchar+1)
ist ein char
, und & 0xFF00
auf einem char
wird immer 0 ergeben (weil ein char
ist nur 8 Bits zu beginnen, zumindest auf heutigen Maschinen ...). Und dann verschiebst du diese 8 Bits nach rechts ...?
Und für den Fall waren Sie nicht bewusst zu sein, wenn Sie nicht 0x00FF auf der linken Seite benutzt hatte (*pchar
auf die Breite des rechten Operanden zu fördern), aber (char
-sized) 0xFF, die Ergebnis dieser Operation wäre immer noch vom Typ char
, und das Verschieben dieser 8 Bits nach links macht auch keinen großen Sinn (da der Typ nicht magisch erweitert wird).
Ein anderer Weg, um dies zu realisieren noch nicht erwähnt ist die union
:
#include <stdio.h>
struct chars_t
{
// could also go for char[2] here,
// whichever makes more sense semantically...
char first;
char second;
};
union combo_t
{
// elements of a union share the memory, i.e.
// reside at the same address, not consecutive ones
short shrt;
struct chars_t chrs;
};
int main()
{
union combo_t x;
x.chrs.first = 0x01;
x.chrs.second = 0x02;
printf("%x", x.shrt);
return 0;
}
Wenn Sie dies in einem größeren Kontext verwenden, die struct Polsterung in Acht nehmen.
Sie können memcpy nicht auf diese Weise verwenden, da diese Dateitypen nicht automatisch getarnt werden können. Sie müssen über das src-Array iterieren und jeden Wert in kurze Werte umwandeln. – Westranger
Sie müssen wissen, ob die Abkürzung als [Little-Endian oder Big-Endian] dargestellt wird (http://en.wikipedia.org/wiki/Endianess). – interjay
Sie müssen die Endianess von pchar und pshort wissen. Wenn sie identisch sind, verwenden Sie 'memcpy ((void *) pshort, (const void *) pchar, sizeof (kurz));' –