копирование короткого int в массив char - PullRequest
3 голосов
/ 02 июня 2010

У меня есть короткая целочисленная переменная с именем s_int, которая содержит значение = 2

unsighed short s_int = 2;

Я хочу скопировать это число в массив символов в первую и вторую позицию массива символов.

Допустим, у нас есть char buffer[10];. Мы хотим, чтобы два байта s_int были скопированы в buffer[0] и buffer[1].

Как я могу это сделать?

Ответы [ 5 ]

13 голосов
/ 02 июня 2010

Обычный способ сделать это - использовать побитовые операторы для нарезки и нарезки по байтам за раз:

b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;

хотя это действительно должно быть сделано в unsigned char, а не просто char, поскольку они подписаны в большинстве систем.

Хранение больших целых чисел может быть выполнено аналогичным образом или с помощью цикла.

6 голосов
/ 02 июня 2010

*((short*)buffer) = s_int;

Но viator emptor , что результирующий порядок байтов будет изменяться с порядком байтов.

3 голосов
/ 02 июня 2010

С помощью указателей и приведений.

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];
2 голосов
/ 02 июня 2010

Я бы запомнил это, что-то вроде

memcpy(buffer, &s_int, 2);

Порядковый порядок сохраняется правильно, так что если вы приведете буфер к unsigned short *, вы сможете прочитать то же значение s_int правильным образом. Другое решение должно быть с поддержкой endian, иначе вы можете поменять местами lsb и msb. И конечно размер (короткий) должен быть 2.

0 голосов
/ 02 июня 2010

Если вы не хотите делать все эти побитовые вещи, вы можете сделать следующее

char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);
...