В настоящее время я пытаюсь преобразовать целое число в char *, чтобы отправить его по сокету. В методе приема я логически пытаюсь снова обработать char * как целое число, но, похоже, что-то не хватает, потому что я не могу понять это правильно.
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int num1 = 42; // Works
int num2 = 100; // Works
int num3 = 126; // Works
int num4 = 517; // Doesn't seem to work for int > 127
char p1[sizeof(int)];
*p1 = num1;
char p2[sizeof(int)];
*p2 = num2;
char p3[sizeof(int)];
*p3 = num3;
char p4[sizeof(int)];
*p4 = num4;
void* pA = p4;
void* pB = &num4;
int result1 = static_cast<int>(*p1);
int result2 = static_cast<int>(*p2);
int result3 = static_cast<int>(*p3);
int result4 = static_cast<int>(*p4);
int resultV1 = *static_cast<int*>(pA);
int resultV2 = *reinterpret_cast<int*>(p3);
unsigned int resultV3 = static_cast<int>(*p4);
int resultV4 = *static_cast<int*>(pB); // Works, but I need to convert a char* into an int, not a void* into an int
cout << "R1: " << result1 << endl;
cout << "Expected: " << num1 << endl << endl;
cout << "R2: " << result2 << endl;
cout << "Expected: " << num2 << endl << endl;
cout << "R3: " << result3 << endl;
cout << "Expected: " << num3 << endl << endl;
cout << "R4: " << result4 << endl;
cout << "Expected: " << num4 << endl << endl;
cout << "RV1: " << resultV1 << endl;
cout << "Expected: " << num4 << endl << endl;
cout << "RV2: " << resultV2 << endl;
cout << "Expected: " << num4 << endl << endl;
cout << "RV3: " << resultV3 << endl;
cout << "Expected: " << num4 << endl << endl;
cout << "RV4: " << resultV4 << endl;
cout << "Expected: " << num4 << endl << endl;
getchar();
return 0;
}
Я не знаю, как решить эту проблему на данный момент. Я попробовал несколько других способов, но никто из них, похоже, не работал правильно. Существенно, что целое число преобразуется в char * сначала, поскольку метод recv() в WinSock-API хранит свои прочитанные байты в буфере char-array.
Любые объяснения или решения? Заранее спасибо.
Вы можете сделать это так:
//to a char*
char *P2 = static_cast<char *>((void*)Tst);
//from a char *
int *S1 = static_cast<int *>((void *)P2);
Однако, если вы отправляете одно и то же количество ints каждый раз, когда вы отправляете, вы можете захотеть вместо этого отправить блоки данных, например:
int Data[4] ={42,100,126,517};
char *C1 = static_cast<char*>((void*)Data);
send(socket,C1, sizeof(int[4]),NULL);
и получать: char * Buff = new char [16]; recv (socket, buff, sizeof (int [4]), 0); int Data = static_cast ((void) buff); int R1 = Данные [0]; int R2 = данные [1]; int R3 = Данные [2]; int R4 = данные [3];
или если вы отправляете смешанные данные, но формат для каждой передачи одинаковый, используйте структуры, например:
struct dataBlock
{
char ID[20];
int R1;
int R2;
int R3;
int R4;
};
...
dataBlock Data = {"test\0", 57,100,127,156};
char *Buff = static_cast<char*>((void*)&Data);
send(socket, Buff, sizeof(dataBlock), 0);
а затем получить:
char *Buff = new char[sizeof(dataBlock)];
recv(socket, Buff, sizeof(dataBlock),0);
dataBlock * Data = static_cast<dataBlock*>((void*)Buff);
Извините за мой примитивный синтаксис. У вас нет действительно хороших и полных объяснений, подождите некоторых, но это работает.
char p1[sizeof(int)];
*((int *) p1) = num1;
char p2[sizeof(int)];
*((int *) p2) = num2;
char p3[sizeof(int)];
*((int *) p3) = num3;
char p4[sizeof(int)];
*((int *) p4) = num4;
void* pA = p4;
void* pB = &num4;
int result1 = *((int *)p1);
int result2 = *((int *)p2);
int result3 = *((int *)p3);
int result4 = *((int *)p4);
Если вы не хотите использовать указатели стиля C, возможно, вы можете попробовать это.
void int2CharArr(int num, char* p1){
p1[0] = num & 0xFF;
p1[1] = (num >> 8) & 0xFF;
p1[2] = (num >> 16) & 0xFF;
p1[3] = (num >> 24) & 0xFF;
}
int charArr2Int(char* p1){
return (p1[3] << 24) + (p1[2] << 16) + (p1[1] << 8) + p1[0];
}
void test(){
int a = 0x12345678;
char q[sizeof(int)];
int2CharArr(a, q);
int b = charArr2Int(q);
printf("%x , %x , %x , %x\n", *q, *(q+1), *(q+2), *(q+3));
printf("%x\n", b);
}
std::stringstream
для преобразованияchar*
вint
.char
имеет длину 8 бит, которая может представлять от -128 до 127, если она подписана, а если она без знака, от 0 до 255. Вашnum4
слишком велик для представления символа.