Возможно ли это? Я хотел преобразовать это в char *, чтобы впоследствии получить эти значения.Преобразование массива int в char *
ответ
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, чтобы делать сокеты для вас.
В идеале последний элемент в массиве будет равен нулю, если кто-то по линии передаст char * функции str *. – hamishmcn
Это намерение явно не указано в вопросе. –
Казалось, это сработало, но просто интересно: как мне получить от него фактические данные? Например, если я напечатал это, он фактически дал мне символ смайлика (= D). Я предполагаю, что это то, что 1234 представляет или что-то в этом роде. Могу ли я на самом деле разобрать это обратно в 1,2,3,4? – seed
Это то, что вы хотите сделать?
int list[5] = {1,2,3,4,5};
char * pChar = (char *)list;
Вы можете использовать C-стиле, но в C++:
int arr[] = {0, 1, 2, 3, 4};
char* p_arr = reinterpret_cast<char*>(arr);
Да, но вы, вероятно, не следует.
Это будет обрабатывать int как последовательности байтов. Заманчиво затем передавать эти байты в файлы или через сокеты. Проблема в том, что результат не будет переносимым. Нет никакой гарантии, что любой компьютер, считывающий эти байты, будет интерпретировать их таким же образом. Самая большая проблема - по-биндиански против маленького-endian. По сути, некоторые компьютеры сначала помещают самый старший байт, тогда как другие сначала помещают младший старший байт. Переключение между ними приведет к тому, что число будет считано назад.
Ах да, я читал об этом ....в то время как я предполагаю, что это очень плохая идея, я просто попробую, это скорее эксперимент, чем что-то, что выйдет на рынок;) – seed
Если вы хотите использовать строку, используйте 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
Парамеры для функции принимают только char * – seed
@seed: извините, я писал комментарий к коду, когда вы написали свой комментарий. – Potatoswatter
Хорошо, вижу. (Недостаточно символов, поэтому я положу это). – seed
- 1. Преобразование «int» в «char» внутри массива char
- 2. Преобразование массива int в массив char
- 3. Преобразование массива int в массив char
- 4. Преобразование char * в int
- 5. Преобразование int в char
- 6. Преобразование char в int?
- 7. Преобразование char * в int
- 8. Преобразование int в char?
- 9. C - Преобразование int в char
- 10. Преобразование Int в Char Array
- 11. неверное преобразование char * в int
- 12. realloc - преобразование int в char
- 13. Преобразование char cr в int
- 14. Преобразование int в char * C
- 15. Преобразование из char в int
- 16. Преобразование char в int C++
- 17. Преобразование int в Char C#?
- 18. Преобразование int в char из значения int
- 19. Преобразование массива из unsigned char * в char *
- 20. Преобразование int в char в C?
- 21. преобразование массива 2d char в char *
- 22. Преобразование массива INT/всплывают
- 23. Преобразование массива char в массив int без цикла в Java?
- 24. Преобразование char массива в String
- 25. Преобразование char в int для int арифметики в java
- 26. Преобразование из массива unsigned int в массив unsigned char
- 27. Преобразование массива int в массив char с использованием Golang?
- 28. C: Преобразование unsigned char массива в подписанный int (наоборот)
- 29. Преобразование массива int ** в массив char ** другого размера/композиции
- 30. C# int to char преобразование в streamwriter
да ........... – stefanB
С какой целью? –
Выясняете, что искали?Вам нужен массив строк с вашими номерами в них? Вы хотите получить доступ к одному байту за один раз за раз? – Seth