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]);
}

Example Here

如果您是大端字节序,那只是 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;
}