如何将二进制值字符串转换回char
How to convert string of binary values back to char
示例
注意:我只关心信件。因此比特集000001将是CCD_ 1或CCD_。
我有一个名为s
的string
,值为"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_。阵列的名称为a
1(并且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'
(在这种情况下只是A
0,那么您可以简单地执行
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 dec是0x61十六进制。
转换(通过位集转换为二进制/从二进制转换(是不必要的。
(也许我不明白你为什么什么都不想做以某种复杂的方式(。
请注意,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;
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 转换char*时的值不同
- Boost Python 不会自动转换 char* 数据成员
- 除了转换char*之外,还有更好的方法来获得一个变量值吗?
- 如何跨平台转换char*到long long(64位)
- 用atof转换char数组中的浮点数
- C转换char[]为时间戳;