?
Hallo,
wir legen hier bei einem VC++-Projekt konstante Daten in folgendem Format an:
static unsigned int const stringVal[] =
{
'Stri', 'ngVa','l\0\0\0'
};
Später greifen wir dann über den Array index wieder darauf zu und je nach
Art der Verwendung werden sie dann konvertiert.
Wenn wir jetzt über den Index auf die 32bit-Werte zugreifen und sie in
ein unsigned char Array umwandeln, z.B. so:
unsigned char value[4];
value[0] = (unsigned char)((stringVal[i] >> 24) & 0xFF);
value[1] = (unsigned char)((stringVal[i] >> 16) & 0xFF);
value[2] = (unsigned char)((stringVal[i] >> 8) & 0xFF);
value[3] = (unsigned char)(stringVal[i] & 0xFF);
funktioniert das auch alles ganz ordentlich, außer beim letzen Array-Index.
Sobald in dieser Konstante zwei "\0" nacheinander kommen, wird sie offenbar
nicht mehr als unsigned int im Speicher abgelegt, wie die anderen sondern es
sieht so aus, als wäre sie 'verdreht' abgelegt worden.
Also im Code steht: 'y\0\0\0' - aus dem Speicher, wenn als unsigned int
(32bit) gelesen, kommt aber ein '\0\0y\0'.
Kann mir das jemand näher erklären, bzw. einen Ansatz zur Lösung des Problems
nennen, der möglichst auch nicht auf den VC++-Compiler beschränkt ist?
Im Moment haben wir zwei mögliche Workaround, die uns aber beide nicht so
richtig gefallen.
Erstens: Wir machen aus den \0 einfach dummy-Nutzdaten, also z.B.: 'y\0aa',
was dann wieder so aus dem Speicher kommt, wie wir das erwartet hätten.
Zweitens: Wir legen die Daten nicht als lesbare Daten an, sondern als Hex-Zahl
wie z.B. 0x79000000, was natürlich auch den gewünschten Effekt hätte ...
Vielen Dank für Eure Ansätze.
Grüße
Markus