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?

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top