如何将二进制值字符串转换回char

How to convert string of binary values back to char

本文关键字:转换 char 字符串 二进制      更新时间:2023-10-16

示例

注意:我只关心信件。因此比特集000001将是CCD_ 1或CCD_。

我有一个名为sstring,值为"abc"。我取string中的每个char,并通过CCD_ 8。

例如

bitset <6> b1 = s[0];   //a
bitset <6> b2 = s[1];   //b
bitset <6> b3 = s[2];   //c

那么我想要将结果放入CCD_ 10的CCD_。阵列的名称为a1(并且array的每个string将表示每个char的二进制值(

例如

arr[0]   //will hold the value of char 'a' in binary form which is 000001
arr[1]   //will hold the value of char 'b' in binary form which is 000010
arr[2]   //will hold the value of char 'c' in binary form which is 000011

并且我将每个charstring转换为二进制的方式是

arr[0] = b1.to_string();    //arr[0] is now 000001
arr[1] = b2.to_string();    //arr[1] is now 000010
arr[2] = b3.to_string();    //arr[2] is now 000011

现在我的问题来了。如何将它们转换回char

例如

//I want each char to take back the each corresponding letter from the binary values
char c1;   //How do i make the arr[0] value of 000001 to become 'a' again?
char c2;   //Same here
char c3;   //And here

假设您想从ASCII代码64开始,并且'a'(或'A'(在这种情况下只是A0,那么您可以简单地执行

c1 = static_cast<char>(std::bitset<6>(arr[0]).to_ulong() + 64); // 

十进制的'A'65,二进制的是0b01000001。十进制的'a'97,二进制的是0b01100001。在代码中,使用bitset<6>来存储'a'(或'A'(。bitset<6>只能代表2^6符号,即64,因此您将遇到切割。基本上CCD_ 33的最高有效位将被剪切。在这种情况下,bitset<6>('A')变为0b000001,即十进制的1,而bitset<6>('a')变为0b1000001,即十进制中的33。现在,您可以说服自己,添加回64会产生正确的结果。

编辑

请注意,您也可以使用std::stoi(仅限C++11(将位字符串从基数2转换为十进制,如其他答案中所述:

char c1 = static_cast<char>(std::stoi(arr[0], nullptr, 2) + 64);

由于您声明在从二进制转换回char表示后不再需要std::bitset,因此可以避免将其用于转换。

static_cast<char>(std::stoi(arr[i],0,2) + 64);

将原始二进制表示解释为基数为2(二进制(的数字并加64。由于原始char以二进制格式存储在arr数组中,因此可以将它们传递给std::stoi,并在第三个参数中指定值的基数为2。std::stoi需要3个参数:您试图转换的字符串,一个指向int的指针,该指针将存储第一个未转换字符的索引(此处不需要,因此可以保留为0(,以及字符串参数的基。以下是更多信息。std::stoi调用的结果是二进制值的基数10(十进制(等效值。vsoftco的回答解释了为什么在获得十进制表示后,添加64是合适的操作。其结果作为CCD_ 50返回。

如果你能负担得起使用更大的std::bitset,你甚至可以取消添加64。

这是一个现场演示:

演示

考虑以下内容:

 std::cout << "abc" << std::endl;
 std::cout << 'a' << 'b' << 'c' << std::endl;
 std::cout << std::dec
           << static_cast<int>('a') << " "
           << static_cast<int>('b') << " "
           << static_cast<int>('c')  << " "<< std::endl;
 std::cout << std::hex
           << static_cast<int>('a') << " "
           << static_cast<int>('b') << " "
           << static_cast<int>('c')  << " "<< std::endl;

带输出

abc

abc

97 98 99

61 62 63

这表明每个字符都是二进制,97 dec0x61十六进制。

转换(通过位集转换为二进制/从二进制转换(是不必要的。

(也许我不明白你为什么什么都不想做以某种复杂的方式(。

请注意,static_cast<>导致没有代码生成。请注意,std::dec和std::hex不会更改数据,只更改基数。

编辑---对于仅8位,您可能会认为。。。无endian问题。

 std::cout << ((('a' >> 7) & 1) ? '1' : '0')
           << ((('a' >> 6) & 1) ? '1' : '0')
           << ((('a' >> 5) & 1) ? '1' : '0')
           << ((('a' >> 4) & 1) ? '1' : '0')
           << ((('a' >> 3) & 1) ? '1' : '0')
           << ((('a' >> 2) & 1) ? '1' : '0')
           << ((('a' >> 1) & 1) ? '1' : '0')
           << ((('a' >> 0) & 1) ? '1' : '0') << "  "
           << ((('b' >> 7) & 1) ? '1' : '0')
           << ((('b' >> 6) & 1) ? '1' : '0')
           << ((('b' >> 5) & 1) ? '1' : '0')
           << ((('b' >> 4) & 1) ? '1' : '0')
           << ((('b' >> 3) & 1) ? '1' : '0')
           << ((('b' >> 2) & 1) ? '1' : '0')
           << ((('b' >> 1) & 1) ? '1' : '0')
           << ((('b' >> 0) & 1) ? '1' : '0') << "  "
           << ((('c' >> 7) & 1) ? '1' : '0')
           << ((('c' >> 6) & 1) ? '1' : '0')
           << ((('c' >> 5) & 1) ? '1' : '0')
           << ((('c' >> 4) & 1) ? '1' : '0')
           << ((('c' >> 3) & 1) ? '1' : '0')
           << ((('c' >> 2) & 1) ? '1' : '0')
           << ((('c' >> 1) & 1) ? '1' : '0')
           << ((('c' >> 0) & 1) ? '1' : '0') << "  "
           << std::endl;

 std::cout << std::dec << std::endl;

 // with variable
 char zulu = 'A';
 std::cout << std::dec
           << "NOTE: in this cout, every use of zulu is a 'read' n"
           << "   zulu: " << zulu                               << "  n"
           << "   dec : " << std::dec << static_cast<int>(zulu) << "  n"
           << "   --- : " << zulu                               << "  n" // zulu not changed
           << "   hex : " << std::hex << static_cast<int>(zulu) << "  n"
           << "   --- : " << zulu                               << "  n" // zulu not changed
           << "   bin : "
           << (((zulu >> 7) & 1) ? '1' : '0')
           << (((zulu >> 6) & 1) ? '1' : '0')
           << (((zulu >> 5) & 1) ? '1' : '0')
           << (((zulu >> 4) & 1) ? '1' : '0')
           << (((zulu >> 3) & 1) ? '1' : '0')
           << (((zulu >> 2) & 1) ? '1' : '0')
           << (((zulu >> 1) & 1) ? '1' : '0')
           << (((zulu >> 0) & 1) ? '1' : '0')    << "  n"
           << "   --- : " << zulu                               << "  n" // zulu not changed
           << " bitset: " << std::bitset<8>(zulu)               << "  n"
           << "   zulu: " << zulu                               << "  nnzulu not changed!" // zulu not changed
           << std::endl;