如何把二进制字符串转换为ASCII字符串??
比如:
char *data;
//data中放的是一些二进制字符串
如何把data字符串转换为ASCII字符串?显示在一个编辑框里Edit1中??
问题点数:50、回复次数:16Top
1 楼talkingmute(CS-{Z})回复于 2005-04-07 08:58:18 得分 0
就算是很简单吧!希望大家帮助写下了!!Top
2 楼xrdsheng(旭日东升)回复于 2005-04-07 09:01:11 得分 0
不用管它是二进制还是....,把那些数据按每字节用串输出就行了,如
AnsiString str;
str = (char*)data;
Edit1->Text=str;
Top
3 楼tompkins2000(AirHunter)回复于 2005-04-07 09:08:03 得分 50
转抄~~~~
// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
for(int i=0; i<nSrcLength; i++)
{
// 输出低4位
*pDst++ = tab[*pSrc >> 4];
// 输出高4位
*pDst++ = tab[*pSrc & 0x0f];
pSrc++;
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nSrcLength * 2;
}
Top
4 楼talkingmute(CS-{Z})回复于 2005-04-07 09:52:41 得分 0
比如:
char *data="0101101101011100";
AnsiString s;
s=(char *)data;
Edit1->Text=s;
这样写吗?还是输出二进制数!Top
5 楼talkingmute(CS-{Z})回复于 2005-04-07 09:54:13 得分 0
我现在就想知道如何在Edit1中显示的是八位二进制数对应的字符...Top
6 楼Maconel(Maconel)回复于 2005-04-07 10:04:06 得分 0
/***********************************
函数作用:
将一个里边由01字符组成的,长度为8的char数组,
转为一个ASCII字符。
参数:
const char szStr[8]
长度为8的数组,注意传进来的数组长度至少要有8。
char* cpRst
返回的结果
返回值:
bool
成功返回true,失败返回false。
***********************************/
bool BinToChar(const char szStr[8], char* cpRst)
{
char cRtn = '\0';
if (szStr == NULL) return false;
for (int i=0; i<8; i++)
{
if (szStr[i] != '0' && szStr[i] != '1') return false;
cRtn = szStr[i] - 48;
cRtn = cRtn << (8 - i - 1);
*cpRst |= cRtn;
}
return true;
}
//---------------------------------------------------------------------------
/***********************************
函数作用:
将一个里边由01字符组成的char*字符串,
转为由对应的ASCII字符组成的AnsiString字符串。
参数:
const char* szStr
源字符串,注意传进来的字符串长度应为8的倍数。
AnsiString* spRst
返回的结果
返回值:
bool
成功返回true,失败返回false。
***********************************/
bool BinToStr(const char* szStr, AnsiString* spRst)
{
char c = '\0';
//确保长度是8的整数
if (szStr == NULL ||
strlen(szStr) % 8 != 0)
{
return false;
}
//一次传进8个字符
while (strlen(szStr) >= 8)
{
c = '\0';
if (!BinToChar(szStr, &c)) return false;
*spRst = *spRst + AnsiString(c);
szStr += 8;
}
return true;
}
//---------------------------------------------------------------------------
//使用时
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char* cpStr = "010000010100001001000011";
AnsiString sRst;
BinToStr(cpStr, &sRst);
Edit1->Text = sRst;
}
//---------------------------------------------------------------------------
Top
7 楼talkingmute(CS-{Z})回复于 2005-04-07 11:05:07 得分 0
万分感谢上边大哥!!
这里,我有些小疑问,就是众所周知,IP数据包里的内容应该是以二进制形式存在的吧?当我用一个字符指针就象上边的data指向它们时,里面是一些"0"和"1"字符的组合还是已经转换好的字符呢??而当我没有做任何转换时,直接把data放在一个AnsiString里时,有时可以显示字符信息,有时则是一些乱码,很想知道这乱码是怎么回事的!!
希望大家能继续帮助下!!Top
8 楼talkingmute(CS-{Z})回复于 2005-04-07 11:09:02 得分 0
当我按照上边程序那样做时,通过Edit1显示那IP数据包时,则什么也没有,也就是说里面已经不再是二进制字符了,可是为什么还有乱码呢??郁闷...Top
9 楼fidt982(痴心绝对~0~)回复于 2005-04-07 11:21:07 得分 0
乱码是因为传过来的数据里面有中文,如果不含中文则会是对的
//////
我也正在处理同样的问题,正在寻找解决办法Top
10 楼talkingmute(CS-{Z})回复于 2005-04-07 11:36:03 得分 0
我那几次的数据里面也有中文的,是一些聊天信息,还有一些html文档内容和一些字符,
就是那乱码搞得比较郁闷,是因为那些数据加密了还是??
不知有没有办法把它们转换过来???
Top
11 楼fidt982(痴心绝对~0~)回复于 2005-04-07 12:29:52 得分 0
一个中文字符要占两个字节,
而英文字符只占一个字节,
所以碰到中文会出现乱码Top
12 楼fidt982(痴心绝对~0~)回复于 2005-04-07 19:59:47 得分 0
不好意思,我弄错了,我在数据传输过程中丢掉了的第一位,所以出现了乱码,
把二进制数组直接赋给字符串,不管是什么,都会原样写出来.Top
13 楼talkingmute(CS-{Z})回复于 2005-04-12 09:46:13 得分 0
to: fidt982(~孤单的人~)
不好意思,这几天一直没有来..
我的部分代码如:
char *Data;
Data=RecvBuf+IP_HdrLen(&ip)+TCP_HdrLen(&tcp);//RecvBuf是缓冲区的IP包内容,Data是IP数据包内容,IP_HdrLen和TCP_HdrLen是得到IP头和TCP头的长度
Memo1->Lines->Add(Data);//把IP数据包内容显示在Memo1中
Memo1中显示的大部分是些乱码,除了一些html文件和一些聊天信息是字符和中文的...
不知其他朋友有什么见解????Top
14 楼fidt982(痴心绝对~0~)回复于 2005-04-12 12:43:16 得分 0
IP_HdrLen(&ip)+TCP_HdrLen(&tcp);//
你后面加这个长度有什么用,,不明白?
Top
15 楼icwin(www.cat898.com.cn)回复于 2005-04-15 20:47:57 得分 0
upTop
16 楼talkingmute(CS-{Z})回复于 2005-05-13 14:53:27 得分 0
to:fidt982(~孤单的人~)
不好意思,最近在做毕设,很久没来了...
加那个长度就是过滤到IP头和TCP头的,直接显示里面的内容
现在问题就是,我得到的包里面内容很乱,有些包长度很小,可是里面的数据很多,有些包长度很大,可是里面的数据却比较小,不知是怎么回事??
char *Data;
Data=RecvBuf+IP_HdrLen(&ip)+TCP_HdrLen(&tcp);//RecvBuf是缓冲区的IP包内容,Data是IP数据包内容,IP_HdrLen和TCP_HdrLen是得到IP头和TCP头的长度
这里,是不是要对Data这块再做以调整?根据每一个IP包的大小来做些偏移或者??
希望大家都来讨论下!Top




