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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 19:45     32х битная чексумма #1
есть задание:
консольная программа:
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);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zvoronz
 Аватар для zvoronz
270 / 237 / 21
Регистрация: 29.05.2012
Сообщений: 889
04.11.2012, 19:53     32х битная чексумма #2
Контро́льная су́мма — некоторое значение, рассчитанное по набору данных путём применения определённого алгоритма и используемое для проверки целостности данных при их передаче или хранении. Также контрольные суммы могут использоваться для быстрого сравнения двух наборов данных на неэквивалентность: с большой вероятностью различные наборы данных будут иметь неравные контрольные суммы.

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

Не по теме:

OlVD, Wiki - код для src32



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

Не по теме:

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

Kastaneda
04.11.2012, 20:25
  #5

Не по теме:

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

OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 20:32  [ТС]     32х битная чексумма #6
оно самое)
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.11.2012, 20:41     32х битная чексумма #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 битное), а не слово как набор букв, разделенных пробелами или знаками препинания.
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 20:55  [ТС]     32х битная чексумма #8
C++
1
2
3
    char ch[4];
    file.read(ch, 4);
    checksum += static_cast<int>(ch);
но static_cast не хочет срабатывать
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.11.2012, 21:05     32х битная чексумма #9
ну в этом случае естественно, вот так попробуй
C++
1
checksum += *(reinterpret_cast<int*>(ch));
только в данном случае нельзя забывать про порядок байтов, скорее всего это будет little-endian. Т.е. массив придется перевернуть перед преведением.
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
04.11.2012, 21:11  [ТС]     32х битная чексумма #10
ночью соображается туго, но смысл его переворачивать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 21:27     32х битная чексумма
Еще ссылки по теме:

Windows 7 Установить вин7 64бит на 32х битную
Установка 32х битной проги на х64 Windows 7
Умножение 32х битных чисел Assembler

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.11.2012, 21:27     32х битная чексумма #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 бита, но думаю это не то, что они хотели бы увидеть
Yandex
Объявления
04.11.2012, 21:27     32х битная чексумма
Ответ Создать тему
Опции темы

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