C++ 获取缓冲区的二进制值
C++ Get binary value of a buffer
我真的很抱歉这个问题的措辞,有点混乱。
假设我有一个缓冲区:
char buffer[4] = {0, 0, 2, 0};
如果我们将其全部转换为二进制,我们将得到一个 32 位无符号整数:
00000000 00000000 00000010 00000000
它的值为512。
所以我的问题是,如何使用 C++ 得到 512 的答案?最好有一些库函数。
感谢您的回答,如果之前有人问过,我很抱歉找不到。
您可以执行一些按位运算:
unsigned int converter(const char buffer[4]) {
return (buffer[0] << 24) |
(buffer[1] << 16) |
(buffer[2] << 8) |
(buffer[3]);
}
如果您是大端字节序,那只是 512。您将二进制格式写为 MSB : LSB 但这不是您表示数组缓冲区中字节的方式。数组中的"LSB"为buffer[0],小端表示如下。
一种type punning is to actually use memcpy. It's actually all optimized away per this compiler explorer comparison的可移植方式,甚至是函数调用。
#include <iostream>
#include <cstdint>
#include <array>
#include <cstring>
std::array<unsigned char, 4> buffer = {0, 2, 0, 0};
template <std::size_t N>
std::uint32_t char_buf_to_int( std::array<unsigned char, N>& b )
{
std::uint32_t i;
std::memcpy( &i, b.data(), b.size() );
return i;
}
int main()
{
std::cout << char_buf_to_int( buffer ) << std::endl;
return 0;
}
编辑:此方法 "works" 但根据某些人的说法,它依赖于编译器允许它在技术上产生未定义的行为。所以使用风险自负。
还有一种方法是使用联合。根据字节顺序,您将必须正确订购缓冲区。见下文。
#include <stdio.h>
union u{
unsigned char buffer[4];
unsigned int x;
} u;
int main()
{
u.buffer[0] = 0;
u.buffer[1] = 2;
u.buffer[2] = 0;
u.buffer[3] = 0;
printf("%d\n", u.x);
return 0;
}
如评论中所述,您也可以使用联合初始化。见下文:
#include <stdio.h>
#include <stdint.h>
union u{
uint8_t buffer[4];
uint32_t x;
};
int main()
{
union u u1 = {.buffer = {0,2,0,0} };
printf("%d\n", u1.x);
return 0;
}
我真的很抱歉这个问题的措辞,有点混乱。
假设我有一个缓冲区:
char buffer[4] = {0, 0, 2, 0};
如果我们将其全部转换为二进制,我们将得到一个 32 位无符号整数:
00000000 00000000 00000010 00000000
它的值为512。
所以我的问题是,如何使用 C++ 得到 512 的答案?最好有一些库函数。
感谢您的回答,如果之前有人问过,我很抱歉找不到。
您可以执行一些按位运算:
unsigned int converter(const char buffer[4]) {
return (buffer[0] << 24) |
(buffer[1] << 16) |
(buffer[2] << 8) |
(buffer[3]);
}
如果您是大端字节序,那只是 512。您将二进制格式写为 MSB : LSB 但这不是您表示数组缓冲区中字节的方式。数组中的"LSB"为buffer[0],小端表示如下。
一种type punning is to actually use memcpy. It's actually all optimized away per this compiler explorer comparison的可移植方式,甚至是函数调用。
#include <iostream>
#include <cstdint>
#include <array>
#include <cstring>
std::array<unsigned char, 4> buffer = {0, 2, 0, 0};
template <std::size_t N>
std::uint32_t char_buf_to_int( std::array<unsigned char, N>& b )
{
std::uint32_t i;
std::memcpy( &i, b.data(), b.size() );
return i;
}
int main()
{
std::cout << char_buf_to_int( buffer ) << std::endl;
return 0;
}
编辑:此方法 "works" 但根据某些人的说法,它依赖于编译器允许它在技术上产生未定义的行为。所以使用风险自负。
还有一种方法是使用联合。根据字节顺序,您将必须正确订购缓冲区。见下文。
#include <stdio.h>
union u{
unsigned char buffer[4];
unsigned int x;
} u;
int main()
{
u.buffer[0] = 0;
u.buffer[1] = 2;
u.buffer[2] = 0;
u.buffer[3] = 0;
printf("%d\n", u.x);
return 0;
}
如评论中所述,您也可以使用联合初始化。见下文:
#include <stdio.h>
#include <stdint.h>
union u{
uint8_t buffer[4];
uint32_t x;
};
int main()
{
union u u1 = {.buffer = {0,2,0,0} };
printf("%d\n", u1.x);
return 0;
}