奇怪,高分求解,关于字符转字符串,加急!!!!

appleIIappleII 2003-10-20 11:42:35
我用以下例子说明问题:代码如下

char SendData[10];//定义字符串数组
SendData[0]='0';
SendData[1]='1';
SendData[2]='2';
//随机产生小于256的整数
randomize();
int SendData3=random(256);
int SendData4=random(256);
int SendData5=random(256);
int SendData6=random(256);
int SendData7=random(256);
int SendData8=random(256);
//将小于256的整数转化为字符
//注意是字符
SendData[3]=SendData3;
SendData[4]=SendData4;
SendData[5]=SendData5;
SendData[6]=SendData6;
SendData[7]=SendData7;
SendData[8]=SendData8;
SendData[9]='\0';

String ss=SendData;
//显示结果
Memo1->Lines->Add("SendData3="+IntToStr(SendData3)+"#"+SendData[3]+"#");
Memo1->Lines->Add("SendData4="+IntToStr(SendData4)+"#"+SendData[4]+"#");
Memo1->Lines->Add("SendData5="+IntToStr(SendData5)+"#"+SendData[5]+"#");
Memo1->Lines->Add("SendData6="+IntToStr(SendData6)+"#"+SendData[6]+"#");
Memo1->Lines->Add("SendData7="+IntToStr(SendData7)+"#"+SendData[7]+"#");
Memo1->Lines->Add("SendData8="+IntToStr(SendData8)+"#"+SendData[8]+"#");
//显示字符串结果
Memo1->Lines->Add("ss="+ss+"#");

看看二个结果
结果1
SendData3=67#C#
SendData4=160#?
SendData5=168#?
SendData6=48#0#
SendData7=25##
SendData8=217#?
ss=012C牗0?
结果2
SendData3=123#{#
SendData4=193#?
SendData5=23##
SendData6=205#?
SendData7=90#Z#
SendData8=48#0#
ss=012{?蚙0#

我想知道:
1、为什么我结尾的表示符号#有时会不出现
2、为什么结尾会出现?号
3、为什么会出现乱码



...全文
105 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
weibz0525 2003-10-22
  • 打赏
  • 举报
回复
呵呵,谢谢behard
blankman 2003-10-21
  • 打赏
  • 举报
回复
不明白你要干什么?
Behard 2003-10-21
  • 打赏
  • 举报
回复
汉字 >= 0xB0
0xA0~0xB0 的是中文标点符号
weibz0525 2003-10-21
  • 打赏
  • 举报
回复
借贵地用一下
是不是汉字的2个字符都是>128&&<32的?
Behard 2003-10-20
  • 打赏
  • 举报
回复
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char SendData[10];//定义字符串数组
SendData[0] = '0';
SendData[1] = '1';
SendData[2] = '2';
//随机产生小于256的整数
randomize();
int SendData3 = 31+ random ( 90 );
int SendData4 = 31+ random ( 90 );
int SendData5 = 31+ random ( 90 );
int SendData6 = 31+ random ( 90 );
int SendData7 = 31+ random ( 90 );
int SendData8 = 31+ random ( 90 );
//将小于256的整数转化为字符
//注意是字符
SendData[3] = SendData3;
SendData[4] = SendData4;
SendData[5] = SendData5;
SendData[6] = SendData6;
SendData[7] = SendData7;
SendData[8] = SendData8;
SendData[9] = '\0';

String ss = SendData;
//显示结果
Memo1->Lines->Add ( "SendData3 = "+ IntToStr(SendData3)+ "#"+ SendData[3]+ "#" );
Memo1->Lines->Add ( "SendData4 = "+ IntToStr(SendData4)+ "#"+ SendData[4]+ "#" );
Memo1->Lines->Add ( "SendData5 = "+ IntToStr(SendData5)+ "#"+ SendData[5]+ "#" );
Memo1->Lines->Add ( "SendData6 = "+ IntToStr(SendData6)+ "#"+ SendData[6]+ "#" );
Memo1->Lines->Add ( "SendData7 = "+ IntToStr(SendData7)+ "#"+ SendData[7]+ "#" );
Memo1->Lines->Add ( "SendData8 = "+ IntToStr(SendData8)+ "#"+ SendData[8]+ "#" );
//显示字符串结果
Memo1->Lines->Add ( "ss = "+ ss+ "#" );
}
whyorwhy 2003-10-20
  • 打赏
  • 举报
回复
转16进制,每2位一段,按字符串进行处理
将char 改为unsigned char or byte
for (int i=0;i<9;i++)
{
ss=ss+IntToHex((SendData[i]),2)+"/";
}
appleIIappleII 2003-10-20
  • 打赏
  • 举报
回复
我的问题的由来是我的数据是从某个设备串过来的,数字在0-256之间,所以我才模拟一个随机数,来测试。
我的最终目的是将传过来的byte,转化成字符串保存。
如果不能转化成字符串,我又怎么办呢?
hy1080 2003-10-20
  • 打赏
  • 举报
回复
这样
设一个中间变量]]

AnsiString tmp;
tmp=str1;
tmp+=str2;
tmp+=str3;

Memo1->Lines->Add(tmp);
这样应当就没问题了
hatumei 2003-10-20
  • 打赏
  • 举报
回复
是不是大于128的字符在显示的时候按照汉字处理了,两个大于128的字符放在一起就可能形成汉字。例如215和216合在一起就是'棕'字.但是你的情况是,前者大于128,而接着小于128,不符合编码规则,最后部分旧无法显示了,另外大于128的字符和#结合大多都是?
CCLIS 2003-10-20
  • 打赏
  • 举报
回复
注意char的取值范围和产生0字符的情况。
fatwave 2003-10-20
  • 打赏
  • 举报
回复
unsigned char SendData[10];//定义字符串数组
SendData[0]='0';
SendData[1]='1';
SendData[2]='2';
//随机产生小于256的整数
randomize();
int SendData3=random(256);
int SendData4=random(256);
int SendData5=random(256);
int SendData6=random(256);
int SendData7=random(256);
int SendData8=random(256);
//将小于256的整数转化为字符
//注意是字符
SendData[3]=SendData3;
SendData[4]=SendData4;
SendData[5]=SendData5;
SendData[6]=SendData6;
SendData[7]=SendData7;
SendData[8]=SendData8;
SendData[9]='\0';

//AnsiString ss=AnsiString(SendData);
//显示结果
int i = 0;
int dec;
while(i < 9)
{
dec = SendData[i + 2];
Memo1->Lines->Add("SendData" + IntToStr(i+2) + "=" + dec + "#" + IntToHex(dec,0)+"#");
i++;
}

//显示字符串结果
//Memo1->Lines->Add("ss="+ss+"#");

用十六进制显示出来!!
unsigned char 0-256
char 0=128
yjy1001 2003-10-20
  • 打赏
  • 举报
回复
[32,127]的字符才是可见的
不可见字符 你试图显示出来肯定是乱码啦
你改写成:
do{
SendData3=random(256);
}while(SendData3>31 && SendData3<128);
do{
int SendData4=random(256);
}while(SendData3>31 && SendData3<128);
do{
int SendData5=random(256);
}while(SendData3>31 && SendData3<128);
do{
int SendData6=random(256);
}while(SendData3>31 && SendData3<128);
do{
int SendData7=random(256);
}while(SendData3>31 && SendData3<128);
do{
int SendData8=random(256);
}while(SendData3>31 && SendData3<128);

然后你再输出 应该就不会出现乱码了
tigerhohoo 2003-10-20
  • 打赏
  • 举报
回复
你这样随机产生的字符,一定是乱码,字符可能是\0,这样导致字符串中断了.
sczyq 2003-10-20
  • 打赏
  • 举报
回复
SendData[6] 或许是小于32大于127的字符,所以就不正常,也就是你提的三点问题。


Memo1->Lines->Add("SendData3="+IntToStr(SendData3)+"#"+IntToStr((int)SendData[3])+"#");
Memo1->Lines->Add("SendData4="+IntToStr(SendData4)+"#"+IntToStr((int)SendData[4])+"#");
......

显示就正常了。
fatwave 2003-10-20
  • 打赏
  • 举报
回复
这是因为ASII码0-128为可见,后128为不可见!!
所以有时能正常显示,出现乱码就中这个原因!!

appleIIappleII 2003-10-20
  • 打赏
  • 举报
回复
急急!!!

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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