我有两个值,0和30,我需要将它的二进制表示存储在每个字节的一个字节上。像:
字节0 = 00000000
字节1 = 00011110
然后将它们连接在一个字符串上,该字符串将打印ASCII为0(NULL)和30(记录分隔符)。所以,不要打印“030”,但是我真的不能在这里,而且命令都不能正确打印。我知道打印不是件好事。
我这样做:
string final_message = static_cast<unsigned char>(bitset<8>(0).to_ulong());
final_message += static_cast<unsigned char>((bitset<8>(answer.size())).to_ulong()); // where answer.size() = 30
cout << final_message << endl;
不确定它是否正确,我从未使用bitset。我认为这是正确的,但接收我的消息的服务器一直告诉我数字是错误的。我很确定我需要的数字是0和30,所以,作为唯一的部分,我不确定它是如何工作的那三行,我在这里提出这个问题。
那三行是对的吗?还有更好的方法吗?
答案 0 :(得分:1)
一个字节(或char
)保存一个8位值,无论您以二进制格式,十进制格式还是作为字符“查看”它,该值都是相同的打印在控制台上。这就是你看待它的方式。
请参阅以下示例。前两个示例byte1
和byte2
是您问题中提到的示例。不幸的是,你在控制台上看不到多少。
因此,我添加了另一个示例,其中说明了以不同方式查看相同值65
的三种方法。希望它有所帮助。
int main(){
char byte1 = 0b00000000;
char byte2 = 0b00011110;
std::cout << "byte1 as 'int value': " << (int)byte1 << "; and as character: " << byte1 << endl;
std::cout << "byte2 as 'int value': " << (int)byte2 << "; and as character: " << byte2 << endl;
char a1 = 65;
char a2 = 'A';
char a3 = 0b001000001;
std::cout << "a1 as 'int value': " << (int)a1 << "; and as character: " << a1 << endl;
std::cout << "a2 as 'int value': " << (int)a2 << "; and as character: " << a2 << endl;
std::cout << "a3 as 'int value': " << (int)a3 << "; and as character: " << a3 << endl;
return 0;
}
输出:
byte1 as 'int value': 0; and as character:
byte2 as 'int value': 30; and as character:
a1 as 'int value': 65; and as character: A
a2 as 'int value': 65; and as character: A
a3 as 'int value': 65; and as character: A
答案 1 :(得分:0)
该行
string final_message = static_cast<unsigned char>(bitset<8>(0).to_ulong());
无法编译。显然,这里不需要bitset
,因为你本质上是juts在路径中添加额外的转换。
如果我将上面的行拆分为2并使用+=
,则生成的字符串大小为2,并包含值为0和30的字符(我在使用调试器时已经检查过)。
所以我不知道你的问题是什么,因为它似乎做你想要的......