如何将二进制值的字符串转换回 char
How to convert string of binary values back to char
例子
注意:我只关心字母。所以 bitset 000001 将是 a
或 A
.
我有一个名为 s
的 string
,其值为 "abc"
。
我取 string
的每个 char
并通过将其转换为二进制值
使用 bitset
.
例如
bitset <6> b1 = s[0]; //a
bitset <6> b2 = s[1]; //b
bitset <6> b3 = s[2]; //c
然后我想将结果放入 strings
的 array
中。数组的名称是 arr
(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
我将每个 char
从 string
转换为二进制的方法是
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'
)在这种情况下只是 000001
,那么你可以简单地做
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
,所以会遇到切割。基本上 2
最重要的位将被删除。在这种情况下,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);
考虑以下因素:
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 dec 是 0x61 十六进制。
不需要转换(通过 bitset 转换为二进制)。
(或者我不明白你为什么什么都不做
以一种有点复杂的方式)。
请注意,static_cast<> 不会导致代码生成。
请注意,std::dec 和 std::hex 不会更改数据,只会更改基数。
编辑---
对于仅 8 位,您可能会考虑这个......没有字节序问题。
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 << " \n\nzulu not changed!" // zulu not changed
<< std::endl;
由于您声明在从二进制转换回 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
),以及字符串参数的基础。 Here's more info on that。 std::stoi
调用的结果是以 10 为底(十进制)的二进制值。 vsoftco 的回答解释了为什么在获得十进制表示后在此处添加 64 是合适的操作。结果返回为 char
.
如果您负担得起使用更大的 std::bitset
,您甚至可以放弃添加 64。
这是一个现场演示:
例子
注意:我只关心字母。所以 bitset 000001 将是 a
或 A
.
我有一个名为 s
的 string
,其值为 "abc"
。
我取 string
的每个 char
并通过将其转换为二进制值
使用 bitset
.
例如
bitset <6> b1 = s[0]; //a
bitset <6> b2 = s[1]; //b
bitset <6> b3 = s[2]; //c
然后我想将结果放入 strings
的 array
中。数组的名称是 arr
(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
我将每个 char
从 string
转换为二进制的方法是
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'
)在这种情况下只是 000001
,那么你可以简单地做
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
,所以会遇到切割。基本上 2
最重要的位将被删除。在这种情况下,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);
考虑以下因素:
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 dec 是 0x61 十六进制。
不需要转换(通过 bitset 转换为二进制)。
(或者我不明白你为什么什么都不做 以一种有点复杂的方式)。
请注意,static_cast<> 不会导致代码生成。 请注意,std::dec 和 std::hex 不会更改数据,只会更改基数。
编辑--- 对于仅 8 位,您可能会考虑这个......没有字节序问题。
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 << " \n\nzulu not changed!" // zulu not changed
<< std::endl;
由于您声明在从二进制转换回 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
),以及字符串参数的基础。 Here's more info on that。 std::stoi
调用的结果是以 10 为底(十进制)的二进制值。 vsoftco 的回答解释了为什么在获得十进制表示后在此处添加 64 是合适的操作。结果返回为 char
.
如果您负担得起使用更大的 std::bitset
,您甚至可以放弃添加 64。
这是一个现场演示: