C ++获取缓冲区的二进制值

时间:2019-04-23 16:04:08

标签: c++ binary buffer

我真的很抱歉这个问题的措辞,这有点令人困惑。

所以可以说我有一个缓冲区:

char buffer[4] = {0, 0, 2, 0};

如果将其全部转换为二进制,则会得到一个32位无符号整数:

00000000 00000000 00000010 00000000

其值为512。

所以我的问题是,如何使用c ++达到512的答案?最好具有一些库函数。

谢谢您的回答,如果您以前曾问过这个问题,我感到非常抱歉,我找不到它。

3 个答案:

答案 0 :(得分:8)

您可以执行一些按位操作:

unsigned int converter(const char buffer[4]) {
  return (buffer[0] << 24) |
         (buffer[1] << 16) |
         (buffer[2] << 8) |
         (buffer[3]);
}

Example Here

答案 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;
}