关于字符和16进制数的转换的问题

hjc11111 2006-09-17 10:14:24
以下程序实现把 Edit 控件中的字符转换为 16进制的程序:
void __fastcall TForm1::hexClick(TObject *Sender)
{ int nBytes = 0;
AnsiString t,s = Edit_Send->Text.Trim(); //把edit 控件中的字符给 s
char Buffer[1000], *EndPtr;
while(s.Length()>0) //
{ int p = s.Pos(' ');
if(p>0)
{ t=s.SubString(1,p-1) ;
s = s.SubString(p+1,s.Length()).Trim();
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16);//十六进制字符串转成字节
}
else
{ t= s;
s = "" ;
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16);//十六进制字符串转成字节
}
}
}

当在edit 控件中输入字符 12 34 45 56 78 90 7 , 单步调试时Buffer数组中的 数据为
Buffer[0] = 0x12;
Buffer[2] = 0x34;
Buffer[3] = 0x45;
Buffer[4] = 0x56;
Buffer[5] = 0x78;
Buffer[6] = 0xFFFFFF90;
Buffer[6] = 0x07 ;

为什么 Buffer[6]的数值会变为 0xFFFFFF90, 而其它就没有变?
请大侠指教
...全文
484 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjc11111 2006-09-19
  • 打赏
  • 举报
回复
我改过了,但编译是出错
void __fastcall TForm1::hexClick(TObject *Sender)
{ int nBytes = 0;
AnsiString t,s = Edit_Send->Text.Trim();
unsigned char Buffer[1000], *EndPtr; //改成unsigned char
while(s.Length()>0)
{ int p = s.Pos(' ');
EndPtr=NULL ;
if(p>0)
{ t=s.SubString(1,p-1) ;
s = s.SubString(p+1,s.Length()).Trim();
Buffer[nBytes] = strtol(t.c_str(),&EndPtr,16);//十六进制字符串转成字节
Buffer[nBytes] = (unsigned char)(Buffer[nBytes]);
nBytes++ ;
}
else
{ t= s;
s = "" ;
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16); //十六进制字符串转成字节
}
}
}

但编译出错如下信息
[C++ Error] Unit1.cpp(109): E2034 Cannot convert 'unsigned char * *' to 'char * *'
[C++ Error] Unit1.cpp(109): E2342 Type mismatch in parameter '__endptr' (wanted 'char * *', got 'unsigned char * *')
[C++ Error] Unit1.cpp(116): E2034 Cannot convert 'unsigned char * *' to 'char * *'
[C++ Error] Unit1.cpp(116): E2342 Type mismatch in parameter '__endptr' (wanted 'char * *', got 'unsigned char * *')
[C++ Warning] Unit1.cpp(130): W8004 'EndPtr' is assigned a value that is never used
netliuming 2006-09-19
  • 打赏
  • 举报
回复
这跟数的转换有关,如果被转换的数的最高位为1,即为负数,高位字节全部补1。
char Buffer[1000],改成unsigned char Buffer[1000]看看
LuoGD 2006-09-18
  • 打赏
  • 举报
回复
Buffer[5]是char所以变成负的了,
把Buffer[5]转成unsigned char 就是0x90了,呵呵!
LuoGD 2006-09-18
  • 打赏
  • 举报
回复
while(s.Length()>0) //
{ int p = s.Pos(' ');
EndPtr = NULL; //要增加这个吧!?
if(p>0)
{ t=s.SubString(1,p-1) ;
s = s.SubString(p+1,s.Length()).Trim();
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16);//十六进制字符串转成字节
}
else
{ t= s;
s = "" ;
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16);//十六进制字符串转成字节
}
}
hjc11111 2006-09-18
  • 打赏
  • 举报
回复
始终不明白为什么会变成负的。我发现只要转换的数值 >0x7f, 就会出现 0xFFFFFFXX. 我用以下程序试也不行。
void __fastcall TForm1::hexClick(TObject *Sender)
{ int nBytes = 0;
AnsiString t,s = Edit_Send->Text.Trim();
char Buffer[1000], *EndPtr;
while(s.Length()>0)
{ int p = s.Pos(' ');
EndPtr=NULL ;
if(p>0)
{ t=s.SubString(1,p-1) ;
s = s.SubString(p+1,s.Length()).Trim();
Buffer[nBytes] = strtol(t.c_str(), &EndPtr, 16);//16进制字符串转字节
Buffer[nBytes] = (unsigned char)(Buffer[nBytes]); //加上这代码
nBytes++ ;
}
else
{ t= s;
s = "" ;
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr,16);//16进制字符串转字节
}
}
}

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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