2010-04-22 3 views
4

Возможно ли это? Я хотел преобразовать это в char *, чтобы впоследствии получить эти значения.Преобразование массива int в char *

+2

да ........... – stefanB

+3

С какой целью? –

+0

Выясняете, что искали?Вам нужен массив строк с вашими номерами в них? Вы хотите получить доступ к одному байту за один раз за раз? – Seth

ответ

7

Sure:

int array[4] = {1, 2, 3, 4}; 
char* c = reinterpret_cast<char*>(array); 

Допустимый диапазон от c до c + sizeof(array). Вы можете сделать это с любым типом POD.

можно заливать обратно из последовательности байтов:

// assuming c above 
int (&pArray)[4] = *reinterpret_cast<int(*)[4]>(c); 

Это гарантированно работать. Но, кажется, вы пытаетесь отправить материал по сети, что может ввести другие проблемы


Процесс, который вы ищете, называется сериализации (и имеет FAQ entry). Это когда вы берете объект, превращаете его в ряд бит, который впоследствии может быть «десериализован» в исходный объект.

Выполнение этой работы на нескольких платформах может быть затруднительным, поскольку вам необходимо убедиться в том, что вы сериализуетесь в определенном формате и что каждая платформа знает, как она должна считываться из этого формата. (Например, платформа big-endian может всегда преобразовываться в little-endian перед отправкой и аналогично конвертировать обратно в big-endian при получении.) Вы не можете обрабатывать не-POD-типы как поток байтов (например, std::string), поэтому вам нужно написать функции сериализации для тех, чтобы преобразовать их данные в поток байтов и функции десериализации, чтобы преобразовать их обратно.

Мне особенно нравится, что Boost делает это, и если вы можете использовать их serialization library. Они в основном сначала определяют процедуры для сериализации фундаментальных типов, тогда вы можете сериализовать более сложные типы, построив их. Конечно, Boost также имеет свои ASIO library, чтобы делать сокеты для вас.

+0

В идеале последний элемент в массиве будет равен нулю, если кто-то по линии передаст char * функции str *. – hamishmcn

+3

Это намерение явно не указано в вопросе. –

+0

Казалось, это сработало, но просто интересно: как мне получить от него фактические данные? Например, если я напечатал это, он фактически дал мне символ смайлика (= D). Я предполагаю, что это то, что 1234 представляет или что-то в этом роде. Могу ли я на самом деле разобрать это обратно в 1,2,3,4? – seed

-1

Это то, что вы хотите сделать?

int list[5] = {1,2,3,4,5}; 

char * pChar = (char *)list; 
0

Вы можете использовать C-стиле, но в C++:

int arr[] = {0, 1, 2, 3, 4}; 
char* p_arr = reinterpret_cast<char*>(arr); 
3

Да, но вы, вероятно, не следует.

Это будет обрабатывать int как последовательности байтов. Заманчиво затем передавать эти байты в файлы или через сокеты. Проблема в том, что результат не будет переносимым. Нет никакой гарантии, что любой компьютер, считывающий эти байты, будет интерпретировать их таким же образом. Самая большая проблема - по-биндиански против маленького-endian. По сути, некоторые компьютеры сначала помещают самый старший байт, тогда как другие сначала помещают младший старший байт. Переключение между ними приведет к тому, что число будет считано назад.

+0

Ах да, я читал об этом ....в то время как я предполагаю, что это очень плохая идея, я просто попробую, это скорее эксперимент, чем что-то, что выйдет на рынок;) – seed

0

Если вы хотите использовать строку, используйте std::string, а не char*. Если вы хотите сериализовать, используйте <stringstream>.

#include <stringstream> 

std::ostringstream packet_os; 
for (int i = 0; i < 5; ++ i) packet_os << arr[ i ] << " "; 
network_send(packet_os.str().c_str()); // c_str() returns char* 

На другом конце:

network_receive(recv_buf); 
std::istringstream packet_is(recv_buf->bytes); 
for (int i = 0; i < 5; ++ i) packet_is >> arr[ i ]; 
assert (packet_is); // for debugging, check that everything was received OK 
+0

Парамеры для функции принимают только char * – seed

+0

@seed: извините, я писал комментарий к коду, когда вы написали свой комментарий. – Potatoswatter

+0

Хорошо, вижу. (Недостаточно символов, поэтому я положу это). – seed

Смежные вопросы