C ++ Получить двоичное значение буфера - PullRequest
7 голосов
/ 23 апреля 2019

Мне очень жаль формулировку вопроса, это немного сбивает с толку.

Итак, допустим, у меня есть буфер:

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

, если мы преобразуем все это в двоичный файл, мы получим одно 32-битное целое число без знака:

00000000 00000000 00000010 00000000

Значение 512.

Итак, мой вопрос: как мне получить ответ 512, используя c ++?Желательно с некоторой библиотечной функцией.

Спасибо за любой ответ, и мне очень жаль, если об этом уже спрашивали, я не смог его найти.

Ответы [ 3 ]

8 голосов
/ 23 апреля 2019

Вы можете выполнить несколько побитовых операций:

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

Пример здесь

0 голосов
/ 23 апреля 2019

РЕДАКТИРОВАТЬ: Этот метод "работает", но, по мнению некоторых людей, он полагается на компилятор, чтобы разрешить его, так как технически он производит неопределенное поведение. Так что используйте на свой страх и риск.

И еще один способ - использовать союз. В зависимости от порядка байтов вам придется правильно упорядочить буфер. Смотри ниже.

#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;
}
0 голосов
/ 23 апреля 2019

Это всего лишь 512, если вы находитесь в порядке байтов.Вы записываете двоичный формат как MSB: LSB, но это не то, как вы представляете байты в буфере массива.«LSB» в массиве является буфером [0], представление с прямым порядком байтов показано ниже.

Переносимый способ типа punning состоит в том, чтобы фактически использовать memcpy.На самом деле все это оптимизировано для этого сравнения проводника компилятора , даже вызова функции.

#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;                                                                   
}    
...