Форум программистов, компьютерный форум CyberForum.ru

Перевод файла в двоичный код - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
04.07.2014, 00:09     Перевод файла в двоичный код #1
Привет всем. Возникла проблема: нужно любой файл перевести в двоичный код. Как это сделать средствами C++ или WInAPI?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.07.2014, 00:20     Перевод файла в двоичный код #2
Цитата Сообщение от Bretbas Посмотреть сообщение
нужно любой файл перевести в двоичный код.
Любой файл и так двоичный(бинарный).
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
04.07.2014, 00:46  [ТС]     Перевод файла в двоичный код #3
как мне получить этот код?и манипулировать с цифрами файла
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.07.2014, 01:00     Перевод файла в двоичный код #4
Читать, в бинарном режиме, байты (в char).
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
05.07.2014, 00:08  [ТС]     Перевод файла в двоичный код #5
не пойму все равно как получить нули и единицы в массиве с помощью CreateFile и ReadFile. Покажите пример
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2014, 00:18     Перевод файла в двоичный код #6
При чём здесь нули и единицы, и что за CreateFile и ReadFile?

Добавлено через 2 минуты
Перевод любого файла в бинарный код
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
05.07.2014, 01:15     Перевод файла в двоичный код #7
Где-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
FILE *inp_file=fopen(FileNameInp,"rb");
FILE *out_file=fopen(FileNameOut,"wb");
 
BYTE byte;
char sim;
 
while(!feof(inp_file))
{
  fread(&byte,1,1,file);
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
 
  if(byte>=128)sim='1';
  else sim='0';
  fwrite(&sim,1,1,out_file);
  byte=byte<<1;
}
 
fclose(inp_file);
fclose(out_file);
Добавлено через 1 минуту
Обратное преобразование - тоже самое, только наоборот
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.07.2014, 16:50     Перевод файла в двоичный код #8
Цитата Сообщение от Bretbas Посмотреть сообщение
не пойму все равно как получить нули и единицы
на кой это надо?
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
05.07.2014, 23:40  [ТС]     Перевод файла в двоичный код #9
Jupiter, хочу кое че замутить)
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.07.2014, 23:44     Перевод файла в двоичный код #10
ну так прочил байты и разложи каждый байт на 0 и 1 с помощью битовых операций
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
06.07.2014, 00:43  [ТС]     Перевод файла в двоичный код #11
Jupiter, а вообще байт могу получить как число? Я могу его получить в тип DWORD и вывести на экран?
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
06.07.2014, 01:02     Перевод файла в двоичный код #12
Цитата Сообщение от Bretbas Посмотреть сообщение
DWORD
DWORD - это 4 байта. Впихнуть можно, но зачем? Лучше из файла тогда считывать по 4 байта, но тогда в конце может остаться меньше 4 байт, если размер файла не кратен 4.
Цитата Сообщение от Bretbas Посмотреть сообщение
а вообще байт могу получить как число
Не просто можешь. Скорее даже не можешь иначе - любые данные в компе это числа.

Добавлено через 7 минут
char - это тоже число. Только при работе функций, связанных с текстом, комп пользуется соответствием число-символ(UNICODE и т.п.). Главное считывать-записывать файлы в бинарном режиме.

C++
1
2
3
4
char A='a';
char B='b';
 
if(A<B)cout<<"<Буква a меньше, чем буква b"<<endl;
- это нормально. A и B здесь в первую очередь числа, а уже потом символы.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2014, 04:00     Перевод файла в двоичный код #13
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
string dec_to_bin(int dec)
{
    string bin;
    int b = 0;
    int q = 0;
    
    if (dec != 0)
    {
        while (true)
        {
            q = dec / 2;
            if (q == 0) 
            {
                bin.insert(bin.begin(), '1');
                break;
            }
            b = dec % 2;
            if (b == 0) 
                bin.insert(bin.begin(), '0');
            if (b == 1) 
                bin.insert(bin.begin(), '1');
            dec = q;
        }
    }
    else bin.insert(bin.begin(), '0');
    
    // выравнивание по байту
    unsigned int number_bit = bin.size();
    unsigned int c = (number_bit % 8); 
    if (c != 0)
        for (unsigned int i = 0; i < 8 - c; i++)
            bin.insert(bin.begin(),'0');
    
    return bin;
}
 
int main()
{
    const char* FileNameIn  = "1.txt";
    const char* FileNameOut = "2.txt";
    
    ifstream in(FileNameIn, ios::binary);
    if (!in)
        cout << "Error!" << endl;
    else
    {
        ofstream out(FileNameOut);
 
        unsigned char byte;
        while(in.read((char*)&byte, 1)) // читаем байты из файла
            out << dec_to_bin(byte); // записываем двоичное представление байтов
          
        in.close();
        out.close();
    }
        
    system("pause");
    return 0;
}
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
06.07.2014, 23:03  [ТС]     Перевод файла в двоичный код #14
Retyrn0, то есть мне байты нужно считывать как тип char ,а как потом посмотреть число по этому считаннному байту char?
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
06.07.2014, 23:43     Перевод файла в двоичный код #15
Цитата Сообщение от Bretbas Посмотреть сообщение
то есть мне байты нужно считывать как тип char
Посмотреть==вывести на экран? Я так понял нужно преобразовать в последовательность символов 1 и 2 - тогда просто работай с char-ом, как с обычным числом.

Добавлено через 7 минут
Если выводить на экран, нужно указать функции, чтобы она работала с числом, а не символом. Вот пример: программа выводит на экран значение одной и той же переменной, но в одном случае, как число, а во втором - как символ...

C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main()
{
    for(unsigned int c=0;c<256;c++)
    {
        printf("%d  -   %c\n",c,(char)c);
    }
 
    return 0;
}
Добавлено через 4 минуты
Разобрался?
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
08.07.2014, 00:04  [ТС]     Перевод файла в двоичный код #16
Еще не пробовал.
А так,чтобы сразу прояснить что я хочу сделать : хочу попробовать реализовать архиватор. Придумал алгоритм как 4 вещественных числа заархивировать и на выходе получить 3. Поэтому,хочу файл преобразовать в последовательность чисел и попробовать заархивировать их по моему алгоритму
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
08.07.2014, 20:01     Перевод файла в двоичный код #17
Цитата Сообщение от Bretbas Посмотреть сообщение
хочу файл преобразовать в последовательность чисел
Ну я же сказал, что это и так последовательность чисел. Перевод в символы только займёт время. Как я и думал, тебе не нужны символы. Если хочешь смотреть последовательность бит в файле, то лучше написать прогу, типа блокнота, в бинарном режиме(хотя они уже вроде есть). Для архиваторов нужно использовать битовые операции.

Вот тебе пример вывода значений бит файла, упор на биты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
unsigned char bayt;
 
FILE*file=fopen("file_name","rb");
 
while(!feof(file))
{
    fread(&bayt,1,1,file);//считываем очередной байт из файла
 
    if((bayt>>7)==1)//Выводим первый бит
        printf("1");
    else
         printf("0");
 
 
    if(((bayt>>6)&1)==1)//Выводим второй бит
        printf("1");
    else
         printf("0");
 
    if(((bayt>>5)&1)==1)//Выводим третий бит
        printf("1");
    else
         printf("0");
 
    if(((bayt>>4)&1)==1)//Выводим четвёртый бит
        printf("1");
    else
         printf("0");
 
    if(((bayt>>3)&1)==1)//Выводим пятый бит
        printf("1");
    else
         printf("0");
 
    if(((bayt>>2)&1)==1)//Выводим шестой бит
        printf("1");
    else
         printf("0");
 
    if(((bayt>>1)&1)==1)//Выводим седьмой бит
        printf("1");
    else
         printf("0");
 
    if((bayt&1)==1)//Выводим восьмой бит
        printf("1");
    else
         printf("0");
 
    printf("\n");//все 8 бит очередного байта вывели, переходим на новую строку
}
Всё довольно лаконично. А вот преобразовывать в символы...это страшно
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
08.07.2014, 22:52  [ТС]     Перевод файла в двоичный код #18
да не нужны мне символы уже) мне нужны тупо биты, которые я буду архивировать по своему алгоритму
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
08.07.2014, 23:13     Перевод файла в двоичный код #19
Цитата Сообщение от Bretbas Посмотреть сообщение
нужны тупо биты
Выше написал ппример как побитово работать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2014, 00:14     Перевод файла в двоичный код
Еще ссылки по теме:

Каким образом открыть двоичный код, файла любого формата? C++
C++ Перевод double в двоичный код

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
09.07.2014, 00:14  [ТС]     Перевод файла в двоичный код #20
лан попробую. Выложу здесь если что
Yandex
Объявления
09.07.2014, 00:14     Перевод файла в двоичный код
Ответ Создать тему
Опции темы

Текущее время: 22:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru