Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
1

CRC Checksum 8 bit

20.03.2018, 11:32. Показов 1684. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужна простая консольная программа, которая при перетаскивании файла на неё посчитает CRC всех байт.
Как реализовать?
Что-то ничего не найду в гугле.
Находил но неправильно считает...

Я тут начал:
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    if (argc < 2) cout << "Not arguments" << endl;
    else
    {
        cout << argv[1] << endl;
 
        ifstream file(argv[1], ios_base::in | ios_base::binary);
 
        if (file.is_open() != NULL)
        {
            cout << "File \"" << argv[1] << "\"" << endl;
 
            int sum = 0;
            int buf = 0;
            
            while (file.read((char*)&buf, sizeof(int)))
            {
                // Записывать сумму в sum
            }
            file.close();
 
            cout << "CRC 8 bit: " << sum << endl << endl;
        }
        else cout << "Not file \"" << argv[1] << "\"" << endl;
    }
    cout << endl;
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2018, 11:32
Ответы с готовыми решениями:

USB 2.0: обработка Stuffed Bit и расчет CRC
Уважаемые участники конференции! Расчет CRC Подскажите пожалуйста, есть много примеров расчета...

Обясните мне, если Windows 32 bit, процессор 64 bit, то работает ли 2-ое ядро?
Обясните мне, если ОС Windows 32 bit, процессор 64 bit, все программы установлены разумеется 32...

Разбиение на треугольники: разное поведение WinXP 32 bit и Win 7 64 bit
Добрый день. Народ, я даже знаю в какую тему постить.... Вобщем словил глюк следующего содержания....

Ноут Aspire 5560G: не ставится Windows 7 64-bit, в отличие от 32-bit
На сайту Acer драйвера на 64-битную версию. Три диска втыкал &quot;Windows 7 SP1 64-bit&quot; сейчас. Два...

5
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
20.03.2018, 11:40 2
В чём вопрос? Как сумму считать?
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
20.03.2018, 12:52  [ТС] 3
Да.
Вроде нашел несколько вариантов, сляпал их них:

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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    if (argc < 2) cout << "Not arguments" << endl;
    else
    {
        cout << argv[1] << endl;
 
        ifstream file(argv[1], ios_base::in | ios_base::binary);
 
        if (file.is_open() != NULL)
        {
            unsigned char table[256], crc, buf = 0;
            int i, j;
 
            for (i = 0; i < 256; i++)
            {
                crc = i;
                for (j = 0; j < 8; j++) crc = crc & 1 ? (crc >> 1) ^ 0xAB : crc >> 1;
 
                table[i] = crc;
            };
            crc = 0xFF;
 
            while (file.read((char*)&buf, sizeof(int))) crc = table[(crc ^ buf)];
 
            file.close();
 
            cout << "File \"" << argv[1] << "\"" << endl;
            cout << "CRC 8 bit: " << crc << endl;
        }
        else cout << "Not file \"" << argv[1] << "\"" << endl;
    }
    cout << endl;
    system("pause");
}
Только что-то не правильно считает, и выводит не в HEX а в десятичной.

Так тоже:
C++
1
cout << "CRC 8 bit: " << '\t' << crc << endl;
0
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
20.03.2018, 14:54  [ТС] 4
Блин, да сколько их этих CRT-8?
Весь интернет изгадили, ни то ни другое не работает.
Если брать 1 бай то сумма его должна быть равна ему же.

А тут не поймёшь что генерирует, таблица - просто от 0 до 256, и всегда любой 1 байт равен 00.
28-34 строки.
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
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    if (argc < 2) cout << "Not arguments" << endl;
    else
    {
        ifstream file(argv[1], ios_base::in | ios_base::binary);
 
        if (file.is_open() != NULL)
        {
            unsigned char table[256], crc = 0x80, buf = 0;
            int i = -1, j = -1;
 
            cout.fill('0');
            cout << char(218);
            for (int i = 0; i < 64; i++) cout << char(196);
            cout << char(191) << endl;
            cout << char(179) << "                           CRC Table                            " << char(179) << endl;
            cout << char(195);
            for (int i = 0; i < 64; i++) cout << char(196);
            cout << char(180) << endl;
 
            while (++i < 256) // Генерация таблицы
            {
                crc = i;
 
                while (++j < 8) crc = crc & 1 ? ((crc >> 1) ^ 0x80) : (crc >> 1);
 
                table[i] = crc;
                if(!(i % 16)) cout << char(179) << " " << hex << setw(2) << uppercase << (int) crc;
                else if(!((i + 1) % 16)) cout << "  " << hex << setw(2) << uppercase << (int) crc << " " << char(179) << endl;
                else cout << "  " << hex << setw(2) << uppercase << (int) crc;
            };
            cout << char(192);
            for (int i = 0; i < 64; i++) cout << char(196);
            cout << char(217) << endl << endl;
            crc = 0x00;
 
            while (file.read((char*)&buf, sizeof(int))) crc = table[(crc ^ buf)];
 
            file.close();
 
            cout << "  File \"" << argv[1] << "\"" << endl << endl;
            cout << "  CRC 8 bit: " << hex << setw(2) << uppercase << (int) crc << endl;
        }
        else cout << "Not file \"" << argv[1] << "\"" << endl;
    }
    cout << endl << "  ";
    system("pause");
}
CRC Checksum 8 bit


И ещё когда кидаешь 1мб файл в программу, потом нажимаешь любую кнопку, и вылезает:
---------------------------
Библиотека времени выполнения Microsoft Visual C ++
---------------------------
Ошибка отладки!

Программа: D: \ Project C ++ \ CRC Summ \ Debug \ CRC Checksum 8bit.exe
Модуль: D: \ Project C ++ \ CRC Summ \ Debug \ CRC Checksum 8bit.exe
Файл:

Ошибка проверки времени выполнения # 2 - S

(Нажмите «Повторить», чтобы отладить приложение)

---------------------------
Прервать Повтор Пропустить
---------------------------
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
20.03.2018, 19:50 5
C++
1
sizeof(char)
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
21.03.2018, 09:42  [ТС] 6
Да...Я думал они все однобайтовые.

C++
1
cout << (int) sizeof(char) << " " << (int) sizeof(int) << endl;
1 4
Век живи - век учись.

Добавлено через 51 минуту
Вообще не то это.
Мне просто складывать нужно, контрольная сумма всех байт.
Нафига тут таблицы какие-то суют...

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
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    if (argc < 2) cout << "Not arguments" << endl;
    else
    {
        ifstream file(argv[1], ios_base::in | ios_base::binary);
 
        if (file.is_open() != NULL)
        {
            cout.fill('0');
            cout << endl << endl;
 
            unsigned char crc = 0, buf = 0;
 
            while (file.read((char*)&buf, sizeof(char))) crc += buf;
 
            file.close();
 
            cout << "  File \"" << argv[1] << "\"" << endl << endl;
            cout << "  CRC 8 bit: " << hex << setw(2) << uppercase << (int) crc << endl;
        }
        else cout << "Not file \"" << argv[1] << "\"" << endl;
    }
    cout << endl << "  ";
    system("pause");
}
Все работает как надо. ))
0
21.03.2018, 09:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2018, 09:42
Помогаю со студенческими работами здесь

HP ProBook 6570b (под 64-bit) встанет ли на него Win 32-bit?
Здравствуйте! Необходим ноутбук, чтобы в нем был аппаратный COM-порт - специализированый софт...

Как узнать какая у меня винда (Windows XP SP3 2008): 32 bit или 64 bit?
Как узнать какая у меня винда (Windows XP SP3 2008): 32 bit или 64 bit?

Можно ли изменить шину 64 bit в 128 bit?
Всем привет. Есть видеокарта Palit GeForce GT 430 1gb GDDR3 (GPU: GF108) с шиной 64 бита... ...

Установка 8.1 64-bit второй системой, дополнительно к XP 32-bit
Всем доброго дня! На компе стоит XP Home Edition, 32-бит. Необходимо поставить 8.1pro 64-бит...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru