Копирование короткого вмешательства в массив Чар
-
22-10-2019 - |
Вопрос
У меня есть короткая целочисленная переменная, называемая s_int, которая содержит значение = 2
unsighed short s_int = 2;
Я хочу скопировать этот номер до массива в первой и второй позиции массива ЧАР.
Допустим, у нас есть char buffer[10];
. Анкет Мы хотим два байта s_int
быть скопированным в buffer[0]
а также buffer[1]
.
Как мне это сделать?
Решение
Обычным способом сделать это было бы с бить с помощью операторов, чтобы нарезать и комить его, байт за раз:
b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;
хотя это действительно должно быть сделано в unsigned char
, не простой char
как они подписаны в большинстве систем.
Хранение больших целых чисел может быть сделано аналогичным образом или с петлей.
Другие советы
*((short*)buffer) = s_int;
Но Viator Emptor что полученный байт -приказ будет варьироваться в зависимости от эндсианности.
Используя указатели и слепки.
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];
Я бы сделал это, что -то вроде
memcpy(buffer, &s_int, 2);
Эндианство сохраняется правильно, так что, если вы разыгрываете буфер в беспигенный шорт *, вы можете прочитать то же значение S_INT правильно. Другое решение должно быть в эндсиане, или вы можете поменять LSB и MSB. И, конечно, размер (короткий) должен быть 2.
Если вы не хотите делать все эти кусочки, вы могли бы сделать следующее
char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);