C++ 将给定的二进制转换为等价的ASCII字符字符串的程序

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),因为我们存储字符字符串。

在上述两个解决方案中,第二个解决方案更快,因为它通过操作位值将二进制转换为十进制。位操作始终比其他操作更快。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程