C++ 将给定的二进制转换为等价的ASCII字符字符串的程序
在这个问题中,我们需要将二进制字符串转换为字符字符串。我们可以先将二进制字符串转换为ASCII数字字符串,然后再转换为字符字符串。
问题描述 -我们给出了一个二进制字符串bin_str,其大小是8的倍数。我们需要将二进制字符串转换为字符字符串。
示例示例
输入
bin_str = "0110110001101010"
输出
'lj'
解释 - ‘01101100’等同于十进制中的108,对应ASCII值为‘l’。
‘01101010’等同于106,‘j’具有相同的ASCII值。
输入
bin_str = "1000001100101110011111010010";
输出
'AKOR'
说明
- ‘01000001’ = 65 -> char(65) = A
-
‘01001011’ = 75 -> char(75) = K
-
‘01001111’ = 79 -> char(79) = O
-
‘01010010’ = 82 -> char(82) = R
输入
bin_str = ‘’000111000111’
输出
Not possible.
解释 - 由于bin_str不是8的倍数,无法将二进制字符串转换为字符串。
方法一
在这个方法中,我们将从bin_str中取长度为8的子字符串,并将其转换为十进制值。然后,我们将根据ASCII值将十进制值转换为字符。
算法
步骤1 - 将bin_str的长度存储在bin_len变量中。
步骤2 - 如果bin_len的值不是8的倍数,则返回’无法转换’。
步骤3 - 定义final_str变量以存储字符字符串,并开始遍历二进制字符串。
步骤4 - 从当前索引处取长度为8的子字符串,并执行binTODec()函数将二进制字符串转换为十进制值。
步骤4.1 - 在binToDec()函数中,定义dec_value变量并初始化为零。同时,将’base’变量初始化为1,表示当前基数。
步骤4.2 - 以相反的顺序遍历二进制字符串。如果第pth个字符是’1’,则将基数值添加到’dec_value’变量中。
步骤4.3 - 将基数值乘以2。
步骤4.4 - 返回’dec_value’变量的值。
步骤5 - 在获取二进制字符串的十进制值之后,使用char()将十进制值强制转换为字符,并将其附加到final_Str字符串中。
步骤6 - 返回final_Str字符串。
示例
#include <bits/stdc++.h>
using namespace std;
int binToDec(string bin_str) {
// For storing the resultant decimal value
int dec_value = 0;
// base case
int base = 1;
int str_len = bin_str.length();
for (int p = str_len - 1; p >= 0; p--) {
// Add base value for every 1
if (bin_str[p] == '1')
dec_value += base;
// Multiply the base by 2
base = base * 2;
}
// Return decimal value
return dec_value;
}
string CovertBinToAscii(string bin_str) {
// Get length
int bin_len = int(bin_str.size());
// Check whether the length is divisible by 8 or not
if (bin_len % 8 != 0) {
return "Not Possible!";
}
string final_str = "";
// Traverse string
for (int p = 0; p < bin_len; p += 8) {
int decimal = binToDec((bin_str.substr(p, 8)));
// Convert decimal to char and append to the final string
final_str += char(decimal);
}
// Return Answer
return final_str;
}
int main() {
string bin_str = "0110110001101010";
cout << "The resultant alphanumeric string is - " << CovertBinToAscii(bin_str);
return 0;
}
输出
The resultant alphanumeric string is - lj
时间复杂度 – O(N),因为我们遍历二进制字符串并将其转换为十进制数。
空间复杂度 – O(N),用于存储最终字符串。
方法2
在这种方法中,我们将使用位操作将二进制字符串转换为十进制,并在获得十进制值之后将十进制值转换为ASCII字符。
算法
第1步 - 为了存储最终字符串,定义’final_Str’变量。
第2步 - 开始遍历二进制字符串。在循环中,定义’dec_value’并在每次迭代中初始化为0。
第3步 - 使用嵌套循环进行8次迭代。
第4步 - 将十进制值左移1位。
第5步 - 将十进制值与(bin_str[p + q] – ‘0’)进行OR操作,其值只能是0或1。
第6步 - 一旦嵌套循环的迭代完成,将十进制值进行类型转换为char,并将其附加到final_str字符串。
第7步 - 打印final_str字符串的值。
示例
让我们通过示例输入来理解下面的示例。
- 从’0011000101000010’中,字符串的前8位是’00110001’。
-
初始时,dec_value是00000000。
-
在第一次迭代中,它保持不变,并且当我们与’0’进行OR操作时 – ‘0’ = ‘0’,它保持不变。
-
在第二次迭代中,它保持不变;在第三次迭代中,由于我们用dec_value与’1′ – ‘0’进行OR操作,结果字符串将为00000001。
-
在第四次迭代中,通过左移变为00000010,当与’1’进行OR操作时,变为00000011。
-
通过进行8次迭代,我们可以获得单个字符的十进制值,我们需要找到每个字符。
#include <iostream>
#include <string>
using namespace std;
int main() {
string bin_str = "0011000101000010";
string final_str = "";
// Traverse the binary string
for (int p = 0; p < bin_str.size(); p += 8) {
int dec_value = 0;
// Iterate the next 8 bits
for (int q = 0; q < 8; q++) {
// Left shift decimal value by 1 to build a base
dec_value <<= 1;
// Perfor OR operation
dec_value |= (bin_str[p + q] - '0');
}
// Int to char type casting
final_str += static_cast<char>(dec_value);
}
cout << "The resultant alphanumeric string is - " << final_str;
return 0;
}
输出
The resultant alphanumeric string is - 1B
时间复杂度 – O(N),因为我们遍历二进制字符串。
空间复杂度 – O(N),因为我们存储字符字符串。
在上述两个解决方案中,第二个解决方案更快,因为它通过操作位值将二进制转换为十进制。位操作始终比其他操作更快。