求助:怎么讲二进制字符串转化为英文字符,在线等!

时间:2023-01-07 08:07:06
在MFC编程里已经读取到了Cstring=“0000101010000110110011101100111011101110111101100100111000100110”了 但是怎么转化为我所需要的字符串“Password”呢?

23 个解决方案

#1


每8位截一下,转成10进制,就是ASCII码了,然后转成字符

#2


比如二进制:01000001
先变成十进制:65
再变成ascii: 'A'

#3


转成ASCII码后怎么转字符呢,有具体的代码函数吗?

#4


引用 3 楼 lcdooly 的回复:
转成ASCII码后怎么转字符呢,有具体的代码函数吗?


int i = 65;
char ch = (char)i;

一个强制类型转换

#5


用chr(65)得到A

#6


引用 1 楼 lylm 的回复:
每8位截一下,转成10进制,就是ASCII码了,然后转成字符


没这简单

目前还没有字符串转二进制比特位的函数。

不过你可以使用atoi()将字符串读为整形,然后逐位与0,1比较,每8位一字节对象ASII的一个字节

#7


http://www.cnblogs.com/luhuan860/archive/2009/09/15/1566822.html

#8


谢谢各位,还有弱弱的问下二进制怎么转十进制,我是新手 现在用MFC写程序 网上查到的很多都是C些的 编译不通过的。

#9



int et_math_pow(int base, int exp)
{
int i = 0;
int result = base;

if(base == 0)
{
return 0;
}

if(exp == 0)
{
return 1;
}

for(i = 1; i < exp; i++)
{
result *= base;
}
return result;
}


char *et_str_bin2dec(char *dst, const char *src)
{
int len = strlen(src);
int i = 0;
int sum = 0;
int pow = 0;
if(len <= 0)
{
return dst;
}
for(i = len - 1; i >= 0; i--)
{
if(src[i] != '0')
{
sum += et_math_pow(2,pow);
}
pow++;
}
sprintf(dst,"%d",sum);
return dst;
}


里面et_str_bin2dec就是二进制字符,转10进制字符

#10


我说,楼主
、你确定你这一串二进制字符,能得到Password
我看是不行啊,肉眼看就不行
因为,单看第一个00001010,这是10啊,根本就不是个字母

#11


你的算法是什么了,然后再按照制定的算法加密解密。

#12


引用 10 楼 zhangweiit 的回复:
我说,楼主
、你确定你这一串二进制字符,能得到Password
我看是不行啊,肉眼看就不行
因为,单看第一个00001010,这是10啊,根本就不是个字母


雪亮的眼神啊~~
实情是这样的:我要从INI文件中读取节点 但是节点是二进制的:
[00100010100001100010111010000110]
0000101010000110110011101100111011101110111101100100111000100110=0101101111010011100110111001101110111011101000110001101101110011
1010101011001110101001100100111001110010100001101011011010100110=1001101111010011
0010001010000110001011101000011001000010100001101100111010100110=11110111110101110100011100011111100111111100101110011011011110111111001111100011
0001001011110110110011100010111001110010100001101011011010100110=00100001011011111111011100111111111101110001111111010111010111111111011101001111

我只是表达下这样的需求,我需要还原为字符才能用。我只能用cstring得到这些二进制的值 怎么还原为字符呢?

#13


0111000001100001011100110111001101110111011011110111001001100100

我特地做了个实验
上面一串字符才可以获得password (全小写的)

#14



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *et_str_pre(const char *pre, char *src)
{
int len = strlen(pre) + strlen(src);
char *tmp = (char *)malloc((len + 1) * sizeof(char));
strcpy(tmp,pre);
strcat(tmp,src);
strcpy(src,tmp);
free(tmp);
return src;
}

char *et_str_rev(char *src)
{
int len = strlen(src);
int i = 0;
char ch;
if(len <= 1)
{
return src;
}
for(i = 0; i < len / 2; i++)
{
ch = src[i];
src[i] = src[len - i - 1];
src[len - i - 1] = ch;
}
return src;
}


int et_math_pow(int base, int exp)
{
int i = 0;
int result = base;

if(base == 0)
{
return 0;
}

if(exp == 0)
{
return 1;
}

for(i = 1; i < exp; i++)
{
result *= base;
}
return result;
}

char *et_str_lpad(char *src, char *pad_str, size_t pad_len)
{
size_t i = 0;
int src_len = strlen(src);
int total_len = src_len + pad_len * strlen(pad_str);
//strcpy(src,pad_str);
for(i = 0; i < pad_len; i++)
{
et_str_pre(pad_str,src);
}

src[total_len] = '\0';
return src;
}

char *et_str_pad(char *src, char *pad_str, size_t total_len)
{
if(strlen(src) >= total_len)
{
return src;
}
et_str_lpad(src,pad_str,(total_len - strlen(src)) / strlen(pad_str));
return src;
}


char *et_str_i2s(int num, char *dst)
{
sprintf(dst,"%d",num);
return dst;
}

char *et_str_dec2bin(char *dst, const char *src)
{
int num = atoi(src);
char tmp_str[50] = {'\0'};
int tmp_quotient = num;
int tmp_remainder = 0;
int pos = 0;
while(tmp_quotient / 2 != 0)
{
tmp_remainder = tmp_quotient % 2;
tmp_quotient = tmp_quotient / 2;

if(tmp_remainder == 0)
{
tmp_str[pos++] = '0';
}
else
{
tmp_str[pos++] = '1';
}
}
if(tmp_quotient == 1)
{
tmp_str[pos++] = '1';
}
strcpy(dst,et_str_rev(tmp_str));
return dst;
}


char *et_str_bin2dec(char *dst, const char *src)
{
int len = strlen(src);
int i = 0;
int sum = 0;
int pow = 0;
if(len <= 0)
{
return dst;
}
for(i = len - 1; i >= 0; i--)
{
if(src[i] != '0')
{
sum += et_math_pow(2,pow);
}
pow++;
}
sprintf(dst,"%d",sum);
return dst;
}

int main()
{

//char str[100] = "0000101010000110110011101100111011101110111101100100111000100110";

char str[100] = "0111000001100001011100110111001101110111011011110111001001100100";
//char arr[10][10] = {{0}};
char dst[10] = {0};
char temp_bin[10] = {0};
char temp_dec[10] = {0};
//char temp_fix[10] = {0};
int temp_int = 0;

char *password = "password";

int i = 0;
for(i = 0; i < 8; i++)
{
strncpy(temp_bin,str + i * 8,8);
et_str_bin2dec(temp_dec,temp_bin);
//printf("\n %s %s\n",temp_bin,temp_dec);
dst[i] = atoi(temp_dec);
//printf("-%d-",dst[i]);
}

//for(i = 0; i < 8; i++)
//{
// temp_int = (unsigned int)password[i];
// et_str_i2s(temp_int,temp_dec);
// et_str_dec2bin(temp_bin,temp_dec);
// et_str_pad(temp_bin,"0",8);
// //strncpy(temp_bin,str + i * 8,8);
// et_str_bin2dec(temp_dec,temp_bin);
// //printf("\n %s %s\n",temp_bin,temp_dec);
// //dst[i] = atoi(temp_dec);
// printf("%s",temp_bin);
//}

printf("-%s-",dst);

//printf("\n p %d\n",'p');


getchar();
    return 0;
}




这段代码可以获取到password,有点长
很多都是我自己的函数库,我临时COPY出来用的

#15


头大..还要去转unicode 不过还是谢谢先~

#16



void et_str_bin2str(char *dst, const char *src, size_t char_len)
{
size_t total = 0;
size_t count = 0;
char temp_bin[20] = {0};
char temp_dec[20] = {0};
int temp_int = 0;

size_t i = 0;

total = strlen(src);
count = total/char_len;

for(i = 0; i < count; i++)
{
strncpy(temp_bin,src + i * char_len,char_len);
et_str_bin2dec(temp_dec,temp_bin);
//printf("\n %s %s\n",temp_bin,temp_dec);
dst[i] = atoi(temp_dec);
//printf("-%d-",dst[i]);
}
}

void et_str_str2bin(char *dst, const char *src, size_t char_len)
{
char temp_bin[10] = {0};
char temp_dec[10] = {0};
int temp_int = 0;
size_t src_len = strlen(src);
size_t i = 0;

dst[0] = '\0';
for(i = 0; i < src_len; i++)
{
temp_int = (unsigned int)src[i];
et_str_i2s(temp_int,temp_dec);
et_str_dec2bin(temp_bin,temp_dec);
et_str_pad(temp_bin,"0",8);
et_str_bin2dec(temp_dec,temp_bin);
strcat(dst,temp_bin);
}
}



我顺便也封装了这两个函数
转UNICODE的函数我有

#17



wchar_t *et_wcs_mbs2wcs(wchar_t *dst,const char *src)
{
int src_len = strlen(src);
mbstowcs(dst,src,src_len + 1);
dst[src_len] = '\0';
return dst;
}

char *et_wcs_wcs2mbs(char *dst,const wchar_t *src)
{
int src_len = wcslen(src);
wcstombs(dst,src,src_len * 2 + 1);
dst[src_len * 2] = '\0';
return dst;
}

#18


原理主要是用wcstombs,mbstowcs
你自己也可以去封装成适合你自己用的函数

#19


void Trn(char *S,int SL,char *O)
{
  char *p=S; 
  for(int i=0,n=SL/8;i<n;++i){
    O[i]=0; 
    for(int j=0;j<7;++j,p++)
        O[i] |= *p - '0',O[i]<<=1;
    O[i] |= *p++ - '0';}
  O[SL/8]=0;
}

int main()
{
   char *s1="0111000001100001011100110111001101110111011011110111001001100100";
   int n = strlen(s1);
   char *buf = new char[n+1];
   Trn(s1,n,buf);
   cout << buf;
   return 0;
}

#20


void Trn(char *S,int SL,char *O)
{
  char *p=S; 
  for(int i=0,n=SL/8;i<n;++i){
    O[i]=0; 
    for(int j=0;j<7;++j,p++)
      O[i] |= *p - '0',O[i]<<=1;
    O[i] |= *p++ - '0';}
  O[SL/8]=0;
}

int main()
{
  char *s1="0111000001100001011100110111001101110111011011110111001001100100";
  int n = strlen(s1);
  char *buf = new char[n+1];
  Trn(s1,n,buf);
  cout << buf;
  delete []buf;
  return 0;
}

#21


右移。
强制转换。
不就可以么?

#22



CString strText(_T("0111000001100001011100110111001101110111011011110111001001100100"));
CString strMsg(_T(""));
CString strTmp(_T(""));
while(TRUE)
{
strTmp = strText.Left(8);
BYTE b = (BYTE)_tcstoul(strTmp, NULL, 2);
strMsg += CString(b);
strText = strText.Mid(8);
if(strText.IsEmpty())
break;
}
AfxMessageBox(strMsg);

#23


引用 22 楼 visualeleven 的回复:
C/C++ code

CString strText(_T("0111000001100001011100110111001101110111011011110111001001100100"));
    CString strMsg(_T(""));
    CString strTmp(_T(""));
    while(TRUE)
    {
        strTmp……


错误 8 error C2440: “<function-style-cast>”: 无法从“BYTE”转换为“CString” e:\faceoline\faceonline\faceonline\faceonlinedlg.cpp 631

#1


每8位截一下,转成10进制,就是ASCII码了,然后转成字符

#2


比如二进制:01000001
先变成十进制:65
再变成ascii: 'A'

#3


转成ASCII码后怎么转字符呢,有具体的代码函数吗?

#4


引用 3 楼 lcdooly 的回复:
转成ASCII码后怎么转字符呢,有具体的代码函数吗?


int i = 65;
char ch = (char)i;

一个强制类型转换

#5


用chr(65)得到A

#6


引用 1 楼 lylm 的回复:
每8位截一下,转成10进制,就是ASCII码了,然后转成字符


没这简单

目前还没有字符串转二进制比特位的函数。

不过你可以使用atoi()将字符串读为整形,然后逐位与0,1比较,每8位一字节对象ASII的一个字节

#7


http://www.cnblogs.com/luhuan860/archive/2009/09/15/1566822.html

#8


谢谢各位,还有弱弱的问下二进制怎么转十进制,我是新手 现在用MFC写程序 网上查到的很多都是C些的 编译不通过的。

#9



int et_math_pow(int base, int exp)
{
int i = 0;
int result = base;

if(base == 0)
{
return 0;
}

if(exp == 0)
{
return 1;
}

for(i = 1; i < exp; i++)
{
result *= base;
}
return result;
}


char *et_str_bin2dec(char *dst, const char *src)
{
int len = strlen(src);
int i = 0;
int sum = 0;
int pow = 0;
if(len <= 0)
{
return dst;
}
for(i = len - 1; i >= 0; i--)
{
if(src[i] != '0')
{
sum += et_math_pow(2,pow);
}
pow++;
}
sprintf(dst,"%d",sum);
return dst;
}


里面et_str_bin2dec就是二进制字符,转10进制字符

#10


我说,楼主
、你确定你这一串二进制字符,能得到Password
我看是不行啊,肉眼看就不行
因为,单看第一个00001010,这是10啊,根本就不是个字母

#11


你的算法是什么了,然后再按照制定的算法加密解密。

#12


引用 10 楼 zhangweiit 的回复:
我说,楼主
、你确定你这一串二进制字符,能得到Password
我看是不行啊,肉眼看就不行
因为,单看第一个00001010,这是10啊,根本就不是个字母


雪亮的眼神啊~~
实情是这样的:我要从INI文件中读取节点 但是节点是二进制的:
[00100010100001100010111010000110]
0000101010000110110011101100111011101110111101100100111000100110=0101101111010011100110111001101110111011101000110001101101110011
1010101011001110101001100100111001110010100001101011011010100110=1001101111010011
0010001010000110001011101000011001000010100001101100111010100110=11110111110101110100011100011111100111111100101110011011011110111111001111100011
0001001011110110110011100010111001110010100001101011011010100110=00100001011011111111011100111111111101110001111111010111010111111111011101001111

我只是表达下这样的需求,我需要还原为字符才能用。我只能用cstring得到这些二进制的值 怎么还原为字符呢?

#13


0111000001100001011100110111001101110111011011110111001001100100

我特地做了个实验
上面一串字符才可以获得password (全小写的)

#14



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *et_str_pre(const char *pre, char *src)
{
int len = strlen(pre) + strlen(src);
char *tmp = (char *)malloc((len + 1) * sizeof(char));
strcpy(tmp,pre);
strcat(tmp,src);
strcpy(src,tmp);
free(tmp);
return src;
}

char *et_str_rev(char *src)
{
int len = strlen(src);
int i = 0;
char ch;
if(len <= 1)
{
return src;
}
for(i = 0; i < len / 2; i++)
{
ch = src[i];
src[i] = src[len - i - 1];
src[len - i - 1] = ch;
}
return src;
}


int et_math_pow(int base, int exp)
{
int i = 0;
int result = base;

if(base == 0)
{
return 0;
}

if(exp == 0)
{
return 1;
}

for(i = 1; i < exp; i++)
{
result *= base;
}
return result;
}

char *et_str_lpad(char *src, char *pad_str, size_t pad_len)
{
size_t i = 0;
int src_len = strlen(src);
int total_len = src_len + pad_len * strlen(pad_str);
//strcpy(src,pad_str);
for(i = 0; i < pad_len; i++)
{
et_str_pre(pad_str,src);
}

src[total_len] = '\0';
return src;
}

char *et_str_pad(char *src, char *pad_str, size_t total_len)
{
if(strlen(src) >= total_len)
{
return src;
}
et_str_lpad(src,pad_str,(total_len - strlen(src)) / strlen(pad_str));
return src;
}


char *et_str_i2s(int num, char *dst)
{
sprintf(dst,"%d",num);
return dst;
}

char *et_str_dec2bin(char *dst, const char *src)
{
int num = atoi(src);
char tmp_str[50] = {'\0'};
int tmp_quotient = num;
int tmp_remainder = 0;
int pos = 0;
while(tmp_quotient / 2 != 0)
{
tmp_remainder = tmp_quotient % 2;
tmp_quotient = tmp_quotient / 2;

if(tmp_remainder == 0)
{
tmp_str[pos++] = '0';
}
else
{
tmp_str[pos++] = '1';
}
}
if(tmp_quotient == 1)
{
tmp_str[pos++] = '1';
}
strcpy(dst,et_str_rev(tmp_str));
return dst;
}


char *et_str_bin2dec(char *dst, const char *src)
{
int len = strlen(src);
int i = 0;
int sum = 0;
int pow = 0;
if(len <= 0)
{
return dst;
}
for(i = len - 1; i >= 0; i--)
{
if(src[i] != '0')
{
sum += et_math_pow(2,pow);
}
pow++;
}
sprintf(dst,"%d",sum);
return dst;
}

int main()
{

//char str[100] = "0000101010000110110011101100111011101110111101100100111000100110";

char str[100] = "0111000001100001011100110111001101110111011011110111001001100100";
//char arr[10][10] = {{0}};
char dst[10] = {0};
char temp_bin[10] = {0};
char temp_dec[10] = {0};
//char temp_fix[10] = {0};
int temp_int = 0;

char *password = "password";

int i = 0;
for(i = 0; i < 8; i++)
{
strncpy(temp_bin,str + i * 8,8);
et_str_bin2dec(temp_dec,temp_bin);
//printf("\n %s %s\n",temp_bin,temp_dec);
dst[i] = atoi(temp_dec);
//printf("-%d-",dst[i]);
}

//for(i = 0; i < 8; i++)
//{
// temp_int = (unsigned int)password[i];
// et_str_i2s(temp_int,temp_dec);
// et_str_dec2bin(temp_bin,temp_dec);
// et_str_pad(temp_bin,"0",8);
// //strncpy(temp_bin,str + i * 8,8);
// et_str_bin2dec(temp_dec,temp_bin);
// //printf("\n %s %s\n",temp_bin,temp_dec);
// //dst[i] = atoi(temp_dec);
// printf("%s",temp_bin);
//}

printf("-%s-",dst);

//printf("\n p %d\n",'p');


getchar();
    return 0;
}




这段代码可以获取到password,有点长
很多都是我自己的函数库,我临时COPY出来用的

#15


头大..还要去转unicode 不过还是谢谢先~

#16



void et_str_bin2str(char *dst, const char *src, size_t char_len)
{
size_t total = 0;
size_t count = 0;
char temp_bin[20] = {0};
char temp_dec[20] = {0};
int temp_int = 0;

size_t i = 0;

total = strlen(src);
count = total/char_len;

for(i = 0; i < count; i++)
{
strncpy(temp_bin,src + i * char_len,char_len);
et_str_bin2dec(temp_dec,temp_bin);
//printf("\n %s %s\n",temp_bin,temp_dec);
dst[i] = atoi(temp_dec);
//printf("-%d-",dst[i]);
}
}

void et_str_str2bin(char *dst, const char *src, size_t char_len)
{
char temp_bin[10] = {0};
char temp_dec[10] = {0};
int temp_int = 0;
size_t src_len = strlen(src);
size_t i = 0;

dst[0] = '\0';
for(i = 0; i < src_len; i++)
{
temp_int = (unsigned int)src[i];
et_str_i2s(temp_int,temp_dec);
et_str_dec2bin(temp_bin,temp_dec);
et_str_pad(temp_bin,"0",8);
et_str_bin2dec(temp_dec,temp_bin);
strcat(dst,temp_bin);
}
}



我顺便也封装了这两个函数
转UNICODE的函数我有

#17



wchar_t *et_wcs_mbs2wcs(wchar_t *dst,const char *src)
{
int src_len = strlen(src);
mbstowcs(dst,src,src_len + 1);
dst[src_len] = '\0';
return dst;
}

char *et_wcs_wcs2mbs(char *dst,const wchar_t *src)
{
int src_len = wcslen(src);
wcstombs(dst,src,src_len * 2 + 1);
dst[src_len * 2] = '\0';
return dst;
}

#18


原理主要是用wcstombs,mbstowcs
你自己也可以去封装成适合你自己用的函数

#19


void Trn(char *S,int SL,char *O)
{
  char *p=S; 
  for(int i=0,n=SL/8;i<n;++i){
    O[i]=0; 
    for(int j=0;j<7;++j,p++)
        O[i] |= *p - '0',O[i]<<=1;
    O[i] |= *p++ - '0';}
  O[SL/8]=0;
}

int main()
{
   char *s1="0111000001100001011100110111001101110111011011110111001001100100";
   int n = strlen(s1);
   char *buf = new char[n+1];
   Trn(s1,n,buf);
   cout << buf;
   return 0;
}

#20


void Trn(char *S,int SL,char *O)
{
  char *p=S; 
  for(int i=0,n=SL/8;i<n;++i){
    O[i]=0; 
    for(int j=0;j<7;++j,p++)
      O[i] |= *p - '0',O[i]<<=1;
    O[i] |= *p++ - '0';}
  O[SL/8]=0;
}

int main()
{
  char *s1="0111000001100001011100110111001101110111011011110111001001100100";
  int n = strlen(s1);
  char *buf = new char[n+1];
  Trn(s1,n,buf);
  cout << buf;
  delete []buf;
  return 0;
}

#21


右移。
强制转换。
不就可以么?

#22



CString strText(_T("0111000001100001011100110111001101110111011011110111001001100100"));
CString strMsg(_T(""));
CString strTmp(_T(""));
while(TRUE)
{
strTmp = strText.Left(8);
BYTE b = (BYTE)_tcstoul(strTmp, NULL, 2);
strMsg += CString(b);
strText = strText.Mid(8);
if(strText.IsEmpty())
break;
}
AfxMessageBox(strMsg);

#23


引用 22 楼 visualeleven 的回复:
C/C++ code

CString strText(_T("0111000001100001011100110111001101110111011011110111001001100100"));
    CString strMsg(_T(""));
    CString strTmp(_T(""));
    while(TRUE)
    {
        strTmp……


错误 8 error C2440: “<function-style-cast>”: 无法从“BYTE”转换为“CString” e:\faceoline\faceonline\faceonline\faceonlinedlg.cpp 631