将给定的二进制数转换为等效的 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),因为我们存储字符字符串。
在以上两种解决方案中,第二种解决方案更快,因为它通过操纵位值将二进制转换为十进制。位运算总是比其他运算更快。