c++怎么在char数组里存储int
c++如何在char数组里存储int
c++里的代码:
char sendBuf[100] = {0};
int type=1;
int len=4;
想在sendBuf里保存type,len两个int变量,该如何操作?
cSocket.Send(sendBuf, strlen(sendBuf)+1, 0);
java用IOBuffer.getInt来直接获取type,len的值
试过很多方法,像itoa,sprintf(sendBuf,"%d%d",type,len),sprintf(sendBuf,"%4X%4X",type,len)都没有用
------解决方案--------------------
大哥那个是ascii字符,好吗~~~你要转换啊~~
------解决方案--------------------
楼主不就是想发送数据嘛。给你说一下我在项目中的做法:
#prama pack(1);
struct Msg
{
int a;
int b;
}
char Data[100];
Msg* pData=(Msg*)Data
pData->a=123456;
pData->b=67890;
send(sock,pData,sizeof(Msg));//在java端用同样的结构体接收回来。或者按4个字节一个数据转换成int.
------解决方案--------------------
vs2010 测试通过
#include <iostream>
using namespace std;
void int_save_for_byte_arr(char* pa, int i)
{
unsigned char i_0_7 = i & 0x000000FF;
unsigned char i_8_15 = (i & 0x0000FF00) >> 8;
unsigned char i_16_23 = (i & 0x00FF0000) >> 16;
unsigned char i_24_31 = (i & 0x00FF0000) >> 24;
pa[0] = i_0_7;
pa[1] = i_8_15;
pa[2] = i_16_23;
pa[3] = i_24_31;
return;
}
int main(int argc, _TCHAR* argv[])
{
char sendBuf[100] = {0};
int type=1;
int len=4;
int_save_for_byte_arr(sendBuf, type);
int_save_for_byte_arr(sendBuf + 4, len);
cout << "type = " << *((int *)sendBuf) << endl;
cout << "len = " << *((int*)(sendBuf+4)) << endl;
::getchar();
return 0;
}
------解决方案--------------------
数据为什么会被截断?数据截断和大小端没有关系,是你没有收完整吗?
------解决方案--------------------
这句加上没有?
#prama pack(1);
另外你发送的字节数是多少?接收的字节数又是多少,两者是否一致?
你确定是网络包已经被完整发送和接收了?
你应该用抓包软件好好看一下才知道怎么回事,你这样子调试程序,和瞎猜有什么区别?
------解决方案--------------------
楼主可以了解一下大小端字节序和网络字节序。搜一下Java字节序,可以看到Java采用大端字节序,正是网络字节序。
C++的话,根据平台而定。所以要做的是先将数值转换成网络字节序再发送。C++发送端代码如下:
由于Java端直接读取即可
------解决方案--------------------
发现,你还正他们说的那样,动不动就复制黏贴类型的专家?你这样指导别人,别人寻求一个答案,你让别人去研究wirshark抓包工具,这不是坑别人新人么,,你这样动不动就划个大方向给别人,会让别人乱了马脚,让别人面对问题不知所措,盲目去研究抓包工具
------解决方案--------------------
公婆之间socket通讯,有了矛盾,公说公有理,婆说婆有理。
谁来当裁判?
唯有抓包工具比如wireshark!
c++里的代码:
char sendBuf[100] = {0};
int type=1;
int len=4;
想在sendBuf里保存type,len两个int变量,该如何操作?
cSocket.Send(sendBuf, strlen(sendBuf)+1, 0);
java用IOBuffer.getInt来直接获取type,len的值
试过很多方法,像itoa,sprintf(sendBuf,"%d%d",type,len),sprintf(sendBuf,"%4X%4X",type,len)都没有用
------解决方案--------------------
大哥那个是ascii字符,好吗~~~你要转换啊~~
------解决方案--------------------
楼主不就是想发送数据嘛。给你说一下我在项目中的做法:
#prama pack(1);
struct Msg
{
int a;
int b;
}
char Data[100];
Msg* pData=(Msg*)Data
pData->a=123456;
pData->b=67890;
send(sock,pData,sizeof(Msg));//在java端用同样的结构体接收回来。或者按4个字节一个数据转换成int.
------解决方案--------------------
vs2010 测试通过
#include <iostream>
using namespace std;
void int_save_for_byte_arr(char* pa, int i)
{
unsigned char i_0_7 = i & 0x000000FF;
unsigned char i_8_15 = (i & 0x0000FF00) >> 8;
unsigned char i_16_23 = (i & 0x00FF0000) >> 16;
unsigned char i_24_31 = (i & 0x00FF0000) >> 24;
pa[0] = i_0_7;
pa[1] = i_8_15;
pa[2] = i_16_23;
pa[3] = i_24_31;
return;
}
int main(int argc, _TCHAR* argv[])
{
char sendBuf[100] = {0};
int type=1;
int len=4;
int_save_for_byte_arr(sendBuf, type);
int_save_for_byte_arr(sendBuf + 4, len);
cout << "type = " << *((int *)sendBuf) << endl;
cout << "len = " << *((int*)(sendBuf+4)) << endl;
::getchar();
return 0;
}
------解决方案--------------------
楼主不就是想发送数据嘛。给你说一下我在项目中的做法:
#prama pack(1);
struct Msg
{
int a;
int b;
}
char Data[100];
Msg* pData=(Msg*)Data
pData->a=123456;
pData->b=67890;
send(sock,pData,sizeof(Msg));//在java端用同样的结构体接收回来。或者按4个字节一个数据转换成int.
你说的感觉很复合面向对象的规则,我试过了,但是数据被截断了,是不是要大小端转换下?
数据为什么会被截断?数据截断和大小端没有关系,是你没有收完整吗?
------解决方案--------------------
楼主不就是想发送数据嘛。给你说一下我在项目中的做法:
#prama pack(1);
struct Msg
{
int a;
int b;
}
char Data[100];
Msg* pData=(Msg*)Data
pData->a=123456;
pData->b=67890;
send(sock,pData,sizeof(Msg));//在java端用同样的结构体接收回来。或者按4个字节一个数据转换成int.
你说的感觉很复合面向对象的规则,我试过了,但是数据被截断了,是不是要大小端转换下?
数据为什么会被截断?数据截断和大小端没有关系,是你没有收完整吗?
struct Msg
{
int type;
int userNamelen;
};
Msg* pData = (Msg*)sendBuf;
pData->type = 1;
pData->userNamelen = 4;
结果java收到的是 01,后面的应该都被截断了
这句加上没有?
#prama pack(1);
另外你发送的字节数是多少?接收的字节数又是多少,两者是否一致?
你确定是网络包已经被完整发送和接收了?
你应该用抓包软件好好看一下才知道怎么回事,你这样子调试程序,和瞎猜有什么区别?
------解决方案--------------------
楼主可以了解一下大小端字节序和网络字节序。搜一下Java字节序,可以看到Java采用大端字节序,正是网络字节序。
C++的话,根据平台而定。所以要做的是先将数值转换成网络字节序再发送。C++发送端代码如下:
int type = 1;
int ntype = htonl(type);//转换成网络字节序
char bytes[10];
memcpy(bytes, &ntype, sizeof(int));
socket.send(bytes, sizeof(int), 0);
由于Java端直接读取即可
------解决方案--------------------
建议楼主先学会使用抓包软件如wireshark
发现,你还正他们说的那样,动不动就复制黏贴类型的专家?你这样指导别人,别人寻求一个答案,你让别人去研究wirshark抓包工具,这不是坑别人新人么,,你这样动不动就划个大方向给别人,会让别人乱了马脚,让别人面对问题不知所措,盲目去研究抓包工具
------解决方案--------------------
建议楼主先学会使用抓包软件如wireshark
发现,你还正他们说的那样,动不动就复制黏贴类型的专家?你这样指导别人,别人寻求一个答案,你让别人去研究wirshark抓包工具,这不是坑别人新人么,,你这样动不动就划个大方向给别人,会让别人乱了马脚,让别人面对问题不知所措,盲目去研究抓包工具
公婆之间socket通讯,有了矛盾,公说公有理,婆说婆有理。
谁来当裁判?
唯有抓包工具比如wireshark!