如何把二进制字符串转换为ASCII字符串??

talkingmute 2005-04-06 01:07:30
比如:
char *data;
//data中放的是一些二进制字符串
如何把data字符串转换为ASCII字符串?显示在一个编辑框里Edit1中??
...全文
2440 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
talkingmute 2005-05-13
  • 打赏
  • 举报
回复
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包的大小来做些偏移或者??

希望大家都来讨论下!
icwin 2005-04-15
  • 打赏
  • 举报
回复
up
fidt982 2005-04-12
  • 打赏
  • 举报
回复
IP_HdrLen(&ip)+TCP_HdrLen(&tcp);//

你后面加这个长度有什么用,,不明白?

talkingmute 2005-04-12
  • 打赏
  • 举报
回复
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文件和一些聊天信息是字符和中文的...
不知其他朋友有什么见解????
fidt982 2005-04-07
  • 打赏
  • 举报
回复
一个中文字符要占两个字节,
而英文字符只占一个字节,
所以碰到中文会出现乱码
talkingmute 2005-04-07
  • 打赏
  • 举报
回复
我那几次的数据里面也有中文的,是一些聊天信息,还有一些html文档内容和一些字符,

就是那乱码搞得比较郁闷,是因为那些数据加密了还是??

不知有没有办法把它们转换过来???


fidt982 2005-04-07
  • 打赏
  • 举报
回复
乱码是因为传过来的数据里面有中文,如果不含中文则会是对的

//////
我也正在处理同样的问题,正在寻找解决办法
talkingmute 2005-04-07
  • 打赏
  • 举报
回复
当我按照上边程序那样做时,通过Edit1显示那IP数据包时,则什么也没有,也就是说里面已经不再是二进制字符了,可是为什么还有乱码呢??郁闷...
talkingmute 2005-04-07
  • 打赏
  • 举报
回复
万分感谢上边大哥!!
这里,我有些小疑问,就是众所周知,IP数据包里的内容应该是以二进制形式存在的吧?当我用一个字符指针就象上边的data指向它们时,里面是一些"0"和"1"字符的组合还是已经转换好的字符呢??而当我没有做任何转换时,直接把data放在一个AnsiString里时,有时可以显示字符信息,有时则是一些乱码,很想知道这乱码是怎么回事的!!
希望大家能继续帮助下!!
Maconel 2005-04-07
  • 打赏
  • 举报
回复
/***********************************
函数作用:
将一个里边由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;
}
//---------------------------------------------------------------------------
talkingmute 2005-04-07
  • 打赏
  • 举报
回复
我现在就想知道如何在Edit1中显示的是八位二进制数对应的字符...
talkingmute 2005-04-07
  • 打赏
  • 举报
回复
比如:
char *data="0101101101011100";
AnsiString s;
s=(char *)data;
Edit1->Text=s;

这样写吗?还是输出二进制数!
空中猎手 2005-04-07
  • 打赏
  • 举报
回复
转抄~~~~

// 字节数据转换为可打印字符串
// 如:{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;
}
xrdsheng 2005-04-07
  • 打赏
  • 举报
回复
不用管它是二进制还是....,把那些数据按每字节用串输出就行了,如
AnsiString str;
str = (char*)data;
Edit1->Text=str;
talkingmute 2005-04-07
  • 打赏
  • 举报
回复
就算是很简单吧!希望大家帮助写下了!!
fidt982 2005-04-07
  • 打赏
  • 举报
回复
不好意思,我弄错了,我在数据传输过程中丢掉了的第一位,所以出现了乱码,
把二进制数组直接赋给字符串,不管是什么,都会原样写出来.

13,825

社区成员

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

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