我真的很抱歉这个问题的措辞,这有点令人困惑。
所以可以说我有一个缓冲区:
char buffer[4] = {0, 0, 2, 0};
如果将其全部转换为二进制,则会得到一个32位无符号整数:
00000000 00000000 00000010 00000000
其值为512。
所以我的问题是,如何使用c ++达到512的答案?最好具有一些库函数。
谢谢您的回答,如果您以前曾问过这个问题,我感到非常抱歉,我找不到它。
答案 0 :(得分:8)
您可以执行一些按位操作:
unsigned int converter(const char buffer[4]) {
return (buffer[0] << 24) |
(buffer[1] << 16) |
(buffer[2] << 8) |
(buffer[3]);
}
答案 1 :(得分:0)
如果您是大端,则只有512。您正在将二进制格式记为MSB:LSB,但这不是您表示数组缓冲区中字节的方式。数组中的“ LSB”是buffer [0],小端表示如下所示。
type punning的一种可移植方式是实际使用memcpy。实际上,每个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;
}
答案 2 :(得分:-2)
编辑:此方法“有效”,但据某些人称,它依赖编译器来允许它,因为从技术上讲,它会产生未定义的行为。因此,使用后果自负。
还有另一种方法是使用联合。根据字节序,您将必须正确订购缓冲区。见下文。
#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;
}