谁能帮我看看下面的代码是什么问题?int保存到char[]以及从char []取出int

annkie 2003-08-30 11:34:24
void __stdcall ZipPackage(char* str,char cServerClient,char cFlag,int nPackageNo,const char* Data)
{
str[0] = cServerClient;//server 1,client 0
str[1] = cFlag;//
int nDataLen = strlen(Data);
//保存nPackageNo到str的2-5字节中
char buf[4] = {0};
*(int*)buf = nPackageNo;
for(int i = 0;i < 4;i++)
str[2+i] = buf[i]; //2-5
//保存nDataLen到str的3-6字节中
ZeroMemory(buf,4);
*(int*)buf = nDataLen;
for(int i = 0;i < 4;i++)
str[6+i] = buf[i]; //6-9

strcat(str,Data);
str[nDataLen + 10] = (nDataLen + 10) % 2 == 0 ? '0':'1';
str[nDataLen + 11] = '\0';
}

下面的代码想从char[]中取出int
char pszBuffer[BUFFERSIZE+11];
char pData[BUFFERSIZE];
ZeroMemory(pszBuffer,sizeof(pszBuffer));
ZipPackage(pszBuffer,'0','0',0,"Mission Complete.");
int nRetPackageNo = 0;
//想取出int nRetPackageNo
for(int i = 0;i < 4;i++)
*(&nRetPackageNo + i) = pszBuffer[2+i];//return package no.
// ShowMessage(nRetPackageNo);
ZeroMemory(pData,sizeof(pData));
strncpy(pData,pszBuffer+10,strlen(pszBuffer)-1);
pData[strlen(pData)] = '\0';
// ShowMessage(pData);

//想取出int nPackageNo

int b = 0;
char d[4] = { 0 };
strncpy(d,pszBuffer+2,4);
memcpy( &b, d, 4 );
// ShowMessage(b);

//想取出int nPackageNo

char buff[sizeof(int)] = {0};
strncpy(buff,pszBuffer+2,4);
int n = 0;
n = *(int*)buff;
// ShowMessage(n);

上面的结果不对,谁能帮忙指出问题所在,谢谢了。
...全文
44 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
annkie 2003-08-30
  • 打赏
  • 举报
回复
不好意思,还是有错误,我得出的结果非常的大,能不能把我上面的函数和下面的代码调试一下?
atEleven 2003-08-30
  • 打赏
  • 举报
回复
补充:上例中当 int i=0x11111111的时候转换肯定是对的.
atEleven 2003-08-30
  • 打赏
  • 举报
回复
按楼上的意思,写了个简单的示例
int i=0x10001000;
char buf[4] = {0};
*(int*)buf = i;
//这里buf ={ 0x00,0x10,0x00,0x10 }
//C 语言字符串以0为结尾.所以buf实际上是一个空字符串

int b = 0;
char d[4] = { 0 };
strncpy(d,buf,4); //拷贝空字符串
memcpy( &b, d, 4 ); //得到错误的结果: b = 0

//直接把这4个字节当做整型对待,得到正确的结果: n=0x10001000
int n = *(int*)buf;


C/C++ 语言的字符串是以0为结尾的.所以出错.

annkie 2003-08-30
  • 打赏
  • 举报
回复
非常感谢你不厌其烦的指教,谢谢,揭帖。
atEleven 2003-08-30
  • 打赏
  • 举报
回复
下面是代码:

void __stdcall ZipPackage(
char* str,
char cServerClient,
char cFlag,
int nPackageNo,
const char* Data)
{
(*str) = cServerClient;
*(str+1)= cFlag;
int nDataLen = strlen(Data);

// nPackageNo : 到str的2-5字节
char* pPos=str+2;
*(int*)pPos = nPackageNo;

// nDataLen : 到str的6-9字节
pPos = str+6;
*(int*)pPos = nDataLen;

// Data : 到str的后面
pPos = str+10;
memcpy( (void*)pPos, (void*)Data, nDataLen);

//后面两位
str[nDataLen + 10] = (nDataLen + 10) % 2 == 0 ? '0':'1';
str[nDataLen + 11] = '\0';
}

void main()
{
#define BUFFERSIZE 80
char pszBuffer[BUFFERSIZE+11];
memset((void*)pszBuffer,0, BUFFERSIZE+11 );

ZipPackage(pszBuffer,'0','0',0,"Mission Complete.");

char* pPos = pszBuffer+2;
int nRetPackageNo = *(int*)pPos;

pPos = pszBuffer+6;
int nRetDataLen = *(int*)pPos;

pPos = pszBuffer+10;
//后面pPos所指的就是数据,直接用或者复制出来都可以
char pData[BUFFERSIZE];
memset( (void*)pData, 0, BUFFERSIZE );
memcpy( (void*)pData, (void*)pPos, nRetDataLen);
}
annkie 2003-08-30
  • 打赏
  • 举报
回复
我的意思是要把一个整数保存到一个字符串里面的某4个字节中,然后在一定的时候我又要从这个字符串的相应字节中得到这个整数。我实现的时候碰到很多意外的结果,一般是溢出的原因,担我不知道如何实现我上面的目的?
能否帮忙测试一下我上面的代码,或者你用你的代码帮我实现上面的意思?谢谢了,我c不熟悉,基础的东西一知半解。
atEleven 2003-08-30
  • 打赏
  • 举报
回复
其实你把问题复杂化了.只要在任何需要复制的时候
使用(int*)类型的指针并且按整数值复制
就可以了.
不要使用string相关的任何函数.
annkie 2003-08-30
  • 打赏
  • 举报
回复
上面如果
ZipPackage(pszBuffer,'0','0',-1,"Mission Complete.");
三个结果就是一样的 -1
如果是 0 就出错
如果是 正数 则第一种方法
//想取出int nRetPackageNo
for(int i = 0;i < 4;i++)
*(&nRetPackageNo + i) = pszBuffer[2+i];//return package no.
是对的,后面都是一个很大的数,估计是溢出,我该如何改进呢?
我要的是一个可以传人0-N的整数函数,并且能够取出来。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧