将给定的二进制数转换为等效的 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),因为我们存储字符字符串。

在以上两种解决方案中,第二种解决方案更快,因为它通过操纵位值将二进制转换为十进制。位运算总是比其他运算更快。

更新于: 2023-08-25

407 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告