Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
#1

32х битная чексумма - C++

04.11.2012, 19:45. Просмотров 2305. Ответов 10
Метки нет (Все метки)

есть задание:
консольная программа:
test -f Test.tst -m checksum
печатает 32-хбитную чексумму, рассчитанную по алгоритму checksum = word1 + word2 + … + wordN (word1..wordN – 32-хбитные слова, представляющие содержимое файла)

Кажется, я немного не понимаю, что от меня хотят.
если делать так:
C++
1
2
3
4
long cell = 0;
    file.read((char*)&cell, 4);
    checksum += cell;
    file.close();
То считает с пробелами. Может стоит сделать так:
C++
1
2
3
for (int i=0; i < test.size(); ++i){
    checksum += test[i] << (4 - i%4);
}
где vector<char> test(begin, end);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 19:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос 32х битная чексумма (C++):

9-ти битная передача через COM port - C++
братцы вопрос такой, как мне собственно реализовать девятибитную передачу через ком порт?) bool SerialPort::CreateCOM(string name) {...

Не компилируется 64-битная DLL из 32-битного проекта - C++
Добрый день! У меня есть проект MS VS2010 Prof+WinDDK7600, 32-битная DLL принтпроцессора. Во время печати спулер системы ее...

64-битная версия vcomp.lib и vcompd.lib из Visual Studio 2010 - C++
Здравствуйте. Встала проблема скомпилировать 64-битное приложение с поддержкой OpenMP. В силу рада обстоятельств вынужден использовать...

Обновление ОС с 32х до 64х - Windows Vista
Я решил на новый год купить 2 планки памяти по 4 ГБ. Сейчас у меня 3 ГБ, и стоит 32-разрядная виста. Ну и естественно нужно будет...

Умножение 32х битных чисел - Assembler
use16 org 100h mov cx,word mov ax,word mul cx mov word,ax mov word,dx mov cx,word mov ax,word

Установка 32х битной проги на х64 - Windows 7
Господа подскажите возможно ли такое: Есть у меня старая фоторамка от &quot;лыж&quot; называется LG F8012N-WN. Так вот тут недавно думаю дай к...

10
zvoronz
272 / 240 / 21
Регистрация: 29.05.2012
Сообщений: 889
04.11.2012, 19:53 #2
Контро́льная су́мма — некоторое значение, рассчитанное по набору данных путём применения определённого алгоритма и используемое для проверки целостности данных при их передаче или хранении. Также контрольные суммы могут использоваться для быстрого сравнения двух наборов данных на неэквивалентность: с большой вероятностью различные наборы данных будут иметь неравные контрольные суммы.

Не понимаю причём вам пробелы. В чексумму входят все байты файла. Пробел это тоже байт данных в файле.
0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 19:56  [ТС] #3
так как лучше?)
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2012, 19:59 #4

Не по теме:

OlVD, Wiki - код для src32



Добавлено через 2 минуты

Не по теме:

Собственно вот линк http://ru.wikipedia.org/wiki/Циклический_избыточный_код

0
Kastaneda
04.11.2012, 20:25
  #5

Не по теме:

OlVD, это случаем не тестовое задание в 2gis?

0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 20:32  [ТС] #6
оно самое)
0
Kastaneda
Jesus loves me
Эксперт С++
4756 / 2960 / 243
Регистрация: 12.12.2009
Сообщений: 7,516
Записей в блоге: 2
Завершенные тесты: 1
04.11.2012, 20:41 #7

Не по теме:

Больше года уже задание не меняют



Цитата Сообщение от OlVD Посмотреть сообщение
где vector<char> test(begin, end);
вообще не вариант, а если файл будет 10 ГБ?
Цитата Сообщение от OlVD Посмотреть сообщение
C++
1
2
3
4
long cell = 0;
file.read((char*)&cell, 4);
checksum += cell;
file.close();
не факт, что long 4 байта, поэтому лучше подумать, как по другому сделать.

Помнится они делают упор на то, что хотели бы увидеть код именно на С++, поэтому приведение в стиле С убери, замени на static_cast<>()

Добавлено через 3 минуты
Цитата Сообщение от OlVD Посмотреть сообщение
так как лучше?)
Лучше открыть файл как бинарный и читать по 4 байта. Под словом "слово" в задании подразумевается машинное слово (хотя 32 битное), а не слово как набор букв, разделенных пробелами или знаками препинания.
0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 20:55  [ТС] #8
C++
1
2
3
    char ch[4];
    file.read(ch, 4);
    checksum += static_cast<int>(ch);
но static_cast не хочет срабатывать
0
Kastaneda
Jesus loves me
Эксперт С++
4756 / 2960 / 243
Регистрация: 12.12.2009
Сообщений: 7,516
Записей в блоге: 2
Завершенные тесты: 1
04.11.2012, 21:05 #9
ну в этом случае естественно, вот так попробуй
C++
1
checksum += *(reinterpret_cast<int*>(ch));
только в данном случае нельзя забывать про порядок байтов, скорее всего это будет little-endian. Т.е. массив придется перевернуть перед преведением.
0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 21:11  [ТС] #10
ночью соображается туго, но смысл его переворачивать?
0
Kastaneda
Jesus loves me
Эксперт С++
4756 / 2960 / 243
Регистрация: 12.12.2009
Сообщений: 7,516
Записей в блоге: 2
Завершенные тесты: 1
04.11.2012, 21:27 #11
Потому что таков интеловский порядок байтов. На самом деле все логично - по младшему адресу лежит младший байт, по старшему старший.
C++
1
2
3
unsigned int n; //допустим unsigned int имеет размер 4 байта. 
unsigned char arr[4] = {0x1, 0x2, 0x3, 0x4};
n = *(reinterpret_cast<int*>(arr));
непосвященный человек может предположить, что n будет равно 0x1234, но это не так. n будет равно 0x4321, т.к. младший байт n считается с младшего адреса и т.д.

Поэтому и нужно перевернуть перед преведением.

Добавлено через 1 минуту
советую ознакомиться

Добавлено через 3 минуты
хотя перед разворотом массива советую все же проверить какой порядок байтов используется в машине. 100% это будет little-endian, но просто тем самым ты покажешь "свой" уровень профессионализма

Добавлено через 4 минуты
всего этого геммороя можно было бы избежать, если использовать С++11, там есть тип std::uint32_t, размер которого гарантировано равен 32 бита, но думаю это не то, что они хотели бы увидеть
1
04.11.2012, 21:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 21:27
Привет! Вот еще темы с ответами:

SQLite запуск на 32х и 64 разрядных системах - C#
Добрый день, приложение использует БД написанную при помощи SQLite, всё прекрасно работает на х64, но при попытке запуска на х32 получаю...

Установить вин7 64бит на 32х битную - Windows 7
Помогите пожалуйста установить вин7 64бит на 32х битную, требования удовлетворяющие 64 бит. Я записовал образы и на флешку и на диск не...

Как взять 8 бит 32х-битного числа - C#
есть,например, число в двоичке 10101100 00010000 00100001 00110110 как взять любые(указав какие) 8 бит из него,подскажите пожалуйста?

Компиляция 32х приложений из Ubuntu 64х. Qt Creator - C++ Qt
Доброго всем дня\вечера. Вопрос в заголовке, как?


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru