Kopieren eines kurzen Int in ein Char -Array
-
22-10-2019 - |
Frage
Ich habe eine kurze Ganzzahlvariable namens S_int, die Value = 2 enthält
unsighed short s_int = 2;
Ich möchte diese Nummer in ein Zeichen -Array in die erste und zweite Position eines Char -Arrays kopieren.
Nehmen wir an, wir haben char buffer[10];
. Wir wollen die beiden Bytes von s_int
kopiert werden bei buffer[0]
und buffer[1]
.
Wie kann ich es tun?
Lösung
Der übliche Weg, dies zu tun, wäre bei den bitweisen Operatoren, es zu schneiden und zu würfeln, ein Byte nach dem anderen:
b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;
obwohl dies wirklich zu einem gemacht werden sollte unsigned char
, keine Ebene char
wie sie in den meisten Systemen unterschrieben sind.
Das Speichern größerer Ganzzahlen kann auf ähnliche Weise oder mit einer Schleife durchgeführt werden.
Andere Tipps
*((short*)buffer) = s_int;
Aber Viator emptor Dass die resultierende Byte -Ordnung mit Endiantness variiert.
Durch Verwendung von Zeigern und Abgüssen.
unsigned short s_int = 2;
unsigned char buffer[sizeof(unsigned short)];
// 1.
unsigned char * p_int = (unsigned char *)&s_int;
buffer[0] = p_int[0];
buffer[1] = p_int[1];
// 2.
memcpy(buffer, (unsigned char *)&s_int, sizeof(unsigned short));
// 3.
std::copy((unsigned char *)&s_int,
((unsigned char *)&s_int) + sizeof(unsigned short),
buffer);
// 4.
unsigned short * p_buffer = (unsigned short *)(buffer); // May have alignment issues
*p_buffer = s_int;
// 5.
union Not_To_Use
{
unsigned short s_int;
unsigned char buffer[2];
};
union Not_To_Use converter;
converter.s_int = s_int;
buffer[0] = converter.buffer[0];
buffer[1] = converter.buffer[1];
Ich würde es memkpy, so etwas wie
memcpy(buffer, &s_int, 2);
Die Endiangess ist korrekt erhalten, sodass Sie den gleichen Wert von S_int richtig lesen können, wenn Sie Puffer in unsigned Short *auf die richtige Weise lesen. Eine andere Lösung muss endianbewusst sein oder Sie können LSB und MSB austauschen. Und natürlich muss die Größe von (kurz) 2 sein.
Wenn Sie nicht all das bitweise Zeug machen möchten, können Sie Folgendes tun
char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);