首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有没有二进制与ascii码互转的算法,该如何解决

2012-03-14 
有没有二进制与ascii码互转的算法有没有好一点的算法实现下面两个二进制与可见字符互转的函数(算法尽量简

有没有二进制与ascii码互转的算法
有没有好一点的算法实现下面两个二进制与可见字符互转的函数
(算法尽量简单,速度尽量快,且二进制转换后增存的空间尽量少)

C/C++ code
string BinToString(const char *buffer, size_t len); //将二进制转成可见ascii码字符void StringToBin(const string& str, char *buffer, size_t len); //将二进制转成可见ascii码字符



我想了一个简单的算法
将二进制每个字节拆成连续两个字节,并加上固定偏移量使两字节都变成可见字符
转回来的时候将连续两个字符合减去偏移量后合并成一个

但是比较浪费空间,二进制转成字符串后空间是原来的两倍
有更好的算法吗?

[解决办法]
二进制和可见字符在计算机看来有啥区别?

比如二进制unsigned char buf[] = {0x32,0x33,0x38};
和字符串char * a="238";有啥区别?

在计算机开来没有区别,只是printf时的选项不同,不知道你问题的point在哪里?

这个版讨论的很多c/c++问题都不是问题啊,扎实的找一本c/c++的基础书籍看一遍,比写这样的无数个小程序都有用啊。
[解决办法]
探讨

呵呵 二进制跟可见字符还是有差别的
一个字节的取值范围是0~255
而可见asscii码是这里面一部分子集
你手上有ascii码表吗 查一下吧

[解决办法]
base64编码呀
[解决办法]
试试这个吧。
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
C/C++ code
string BinToString(const char *buffer, size_t len) { //将二进制转成可见ascii码字符    static string str;    static char s[10000];    int i,L;    L=len;    if (L>10000) L=10000;//忽略10000个后面的数据    s[0]=0;    for (i=0;i<L;i++) {        sprintf(s,"%s%02x",buffer[i]);    }    str=s;    return str;}void StringToBin(const string& str, char *buffer, size_t len) { //将二进制转成可见ascii码字符    static char s[10000];    int i,L;    strncpy(s,str.c_str(),20000);    L=strlen(s)/2;    if (L>len) L=len;    for (i=0;i<L;i++) {        sscanf(s+i*2,"%02x",&buffer[i]);    }}
[解决办法]
上面代码中
sprintf(s,"%s%02x",buffer[i]);
应改为
sprintf(s,"%s%02x",s,buffer[i]);

[解决办法]
C/C++ code
const char *tobin = "01";void CharToBin(unsigned char *out,const unsigned char *in,int len){    int i = 0,j = 7;     while(i < len)     {        for (j=7; j>=0; j--)            *out++ = tobin[(in[i] >> j) & 0x01];        ++i;     } }const char *todec = "0123456789" ;void CharToDec(unsigned char *out,const unsigned char *in,int len) {     int i = 0;     while(i < len)     {         *out++ = todec[in[i] / 100];        *out++ = todec[(in[i] % 100) / 10];        *out++ = todec[in[i] % 10];        ++i;     } } const char *tohex = "0123456789ABCDEF"; void CharToHex(unsigned char *out,const unsigned char *in,int len) {     int i = 0;     while(i < len)     {         *out++ = tohex[in[i] >> 4];         *out++ = tohex[in[i] & 0x0F];        ++i;     } } const char *tooct = "01234567"; void CharToOct(unsigned char *out,const unsigned char *in,int len) {     int i = 0;     while(i < len)     {         *out++ = tooct[in[i] >> 6];        *out++ = tooct[(in[i] >> 3) & 0x07];        *out++ = tooct[in[i] & 0x07];        ++i;     } } void BinToChar(unsigned char *out,const unsigned char *in,int inlen){    int i = 0,j = 0,q = 0;    for(q=0; q<inlen;)    {        out[i] = 0;        for (j=0; j<8; j++)            out[i] |= (in[q++] - '0') << (7-j);        i++;    }}void DecToChar(unsigned char *out,const unsigned char *in,int inlen){    int i = 0,q = 0;    for(q=0; q<inlen; q+=3)    {        out[i] = (in[q] - '0') * 100;        out[i] |= (in[q+1] - '0') * 10;        out[i++] |= (in[q+2] - '0');    }}void HexToChar(unsigned char *out,const unsigned char *in,int inlen){    int i = 0,q = 0;    for(q=0; q<inlen; q+=2)    {        out[i] = CharToNum(in[q]) << 4;        out[i++] |= CharToNum(in[q+1]);    }}void OctToChar(unsigned char *out,const unsigned char *in,int inlen){    int i = 0,q = 0;    for(q=0; q<inlen; q+=3)    {        out[i] = (in[q] - '0') << 6;        out[i] |= (in[q+1] - '0') << 3;        out[i++] |= (in[q+2] - '0');    }} 


[解决办法]

探讨

记得以前好像看过一个算法
将两个二进制字节变成三个可见字符的
不过现在忘了名字了
好像是用在邮件传输的

热点排行
Bad Request.