将给定的二进制数转换为等效的 ASCII 字符串的程序
在这个问题中,我们需要将二进制字符串转换为字符字符串。我们可以先将二进制字符串转换为 ASCII 数字字符串,然后可以转换字符字符串。
问题陈述 – 我们给定一个二进制字符串 bin_str,其大小是 8 的倍数。我们需要将二进制字符串转换为字符字符串。
示例
输入
bin_str = "0110110001101010"
输出
'lj'
解释 – ‘01101100’ 等于十进制的 108,这等于 ‘l’ 的 ASCII 值。
‘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 的倍数,因此无法将二进制字符串转换为字符字符串。
方法 1
在这种方法中,我们将从 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 – 反向遍历二进制字符串。如果第 p 个索引处的字符为 ‘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’ - ‘0’ = ‘0’ 进行 OR 操作时,它保持不变。
在第二次迭代中,它保持不变;在第三次迭代中,它发生变化,因为我们对 ‘1’ - ‘0’ 与 dec_value 进行 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),因为我们存储字符字符串。
在以上两种解决方案中,第二种解决方案更快,因为它通过操纵位值将二进制转换为十进制。位运算总是比其他运算更快。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP