Чтение байтов/битов из памяти C++

192
21 апреля 2018, 19:26

У меня есть файл с int числом в нем. Значит в памяти этот файл занимает 4 байта. Так вот, как мне прочитать эти 4 байта и записать в массив char buffer[4] каждый байт?

Также еще вопрос, как мне прочитать биты этого же файла?

P.S. Простите если это глупый вопрос, только начинаю в c++, знаю как читать и записывать в файл и все.

Answer 1

Ну, если это бинарный файл, то вроде того:

int main(int argc, const char * argv[])
{
    char buf[sizeof(int)];
    ifstream in("filename",ios::binary);
    in.read(buf,sizeof(int));
}

Если вы записывали int в текстовый файл - типа

ofile << i;

то что вы хотите прочесть в buf - текстовое же представление числа или внутреннее бинарное представление int?

Update

По результатам беседы в комментариях -

ifstream in("filename");
in >> *(int*)buf;

Ну, или, если тут будут говорить про strict-aliasing - то

ifstream in("filename");
int i;
in >> i;
memcpy(buf,&i,sizeof(int));
Answer 2

У меня как-то была подобная задача: сделать цифровую сортировку для чисел. Чтобы не делить на 10, или типа того, я решил использовать байты, а для этого я воспользовался указателями. Для этого вам понадобится два указателя: на char и на int (можно обойтись без последнего). Берете адрес нужного вам числа и присваиваете его указателю на char, для этого используйте static_cast. После этого просто разыменовываете указатель и значение записываете в массив. После этого инкреминируете указатель и проделываете все заново. Количество повторений равно sizeof (int).

Answer 3

Для начала считайте число в переменную типа uint32_t - это 4-байтное число, а дальше вам потребуются побитовые операции. Вот примерный код. Результат записывается в конец. Для наглядности вывожу в хексах:

#include <stdio.h>
#include <stdint.h>
#define BUF_SIZE 4
int main()
{
    // считали число в переменную x
    uint32_t x = 255;
    uint8_t buffer[BUF_SIZE];
    int i;
    for (i = 0; i < BUF_SIZE; ++i)
    {
        buffer[BUF_SIZE - 1 - i] = (x >> (8 * i)) & 0xff;
    }
    for (i = 0; i < BUF_SIZE; ++i)
    {
        printf("%02X", buffer[i]);
        if (i != (BUF_SIZE - 1) )
        {
            printf(" ");
        }
    }
    printf("\n");
    return 0;
}

Результат:

00 00 00 FF
Answer 4

Один из вариантов:

using namespace std;   
string i;  // если файл бинарный
int  i;   // если текстовый 
//т.е. тип переменной, куда будем читать, зависит от того, текстовый файл или бинарный 
// остальной код одинаков для обеих случаев
file >> i;
const size_t n = sizeof(int);
bitset<n * 8> b(i);
cout << b;
string s = b.to_string();
for (size_t i = n * 8, k = 1; i >= 8; i -= 8, ++k) {
    bitset<8> bch(s.substr(i - 8, i));
    cout << endl << "Бинарный вид бита номер " << k <<'\t' << bch
         << endl << "числовой вид бита номер " << k <<'\t' << bch.to_ulong();
READ ALSO
Передать блок Ruby как аргумент в СXX-extension?

Передать блок Ruby как аргумент в СXX-extension?

Нужно в CXX-extension объявить метод, который принимал бы блок Ruby (чтобы прогресс задачи отслеживать)Использую биндинги RICE

206
Создание двумерного массива C++

Создание двумерного массива C++

создаю, заполняю и вывожу двумерные массивыНо почему-то числа в первой строке и в первом столбце одинаковые

215
Счётчик правильных ответов [требует правки]

Счётчик правильных ответов [требует правки]

У меня имеется программа - тестирование,в которой 10 вопросовКаждый вопрос в отдельной форме

178
Продлить жизнь конструктора

Продлить жизнь конструктора

В конструкторе инициализируются локальные переменныеХотелось бы использовать их в других методах класса, какие есть методы решения данной...

148