C — дайджест сообщения, каждый раз возвращается одно и то же значение (1 из 4 файлов должен иметь другое значение)

Один из моих файлов должен отличаться от других, и эта программа должна сказать мне, какой именно. У меня есть ощущение, что "_setmode..." может быть неправильным (на самом деле почти уверен, что это не имеет никакого эффекта - предполагается, что режим ввода устанавливается в двоичный в начале программы). Для проверки я сбрасываю программу после каждого использования и переименовываю текстовые файлы, чтобы все они тестировались с одним и тем же именем. Я использую C:/Users/User/Desktop/file.txt в качестве команды DOS.

#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(void){
    int s1=0, s2=0, s3=0, s4=0;
    int m1=3, m2=7, m3=13, m4=23;
    int B;
    _setmode(_fileno(stdin), _O_BINARY);

while((B=getchar()) != EOF)
{

   s1 = (s1 + B*m1) % 256;
   s2 = (s1+s2 + B*m2) % 256;
   s3 = (s1+s2+s3 + B*m3) % 256;
   s4 = (s1+s2+s3+s4 + B*m4) % 256;
   B = getchar();
   printf("%02x%02x%02x%02x\n", s1, s2, s3, s4 );
}
return 0;
}

Файлы, которые я использую (pastebin со ссылками pastebin на файлы, так как мне нужно больше представителей, чтобы опубликовать более 2 ссылок):

Ссылки на файлы: http://pastebin.com/wLF9NRNu

Я также только что узнал, что я, по-видимому, должен проверять только значение средней точки, поэтому мне была дана следующая команда, которая кажется мне более или менее бесполезной:

C:\ > mdPoint ‹ файл.txt

Кроме того, поиграв с ним еще немного, кажется, что мои команды вообще не открывают файлы, а просто дают мне вывод на основе текста команды, который я ввожу. Не уверен, что с этим случилось.


person Link2999    schedule 07.02.2015    source источник
comment
Я не думаю, что этот код делает то, что вы думаете. Он перебирает стандартный ввод и вычисляет хеш-значение каждого второго байта, прочитанного из входного потока. Непонятно, каковы ваши намерения.   -  person user590028    schedule 08.02.2015
comment
Он должен вычислять хеш, но из того, что в файлах, а не из входного потока. Вот как должен выглядеть вывод, и некоторая дополнительная информация о выводе (извините, не возвращается в комментариях): Для нас вывод будет состоять из 8 шестнадцатеричных цифр, 0-9, a-f, с использованием ascii. Файл будет прочитан из стандартного ввода с использованием перенаправления файла. Программа используется следующим образом: C:\> mdPoint ‹ file.txt Значение MD: 31965eca Редактировать: Как мне использовать стандартный ввод?   -  person Link2999    schedule 08.02.2015
comment
Ах. Я думал, что вы передаете ему список файлов - я не понял, что перенаправление стандартного ввода было связано с содержимым. В любом случае вам нужно удалить лишний вызов getchar() из цикла while. Это заставляет вас пропускать каждый второй байт в вашем расчете.   -  person user590028    schedule 08.02.2015
comment
Да, вообще не работает, если я это сделаю. Если бы я все еще хотел, чтобы он проверял символы (но не пропускал их) из каждого текстового файла, как бы я сделал это без getchar()?   -  person Link2999    schedule 08.02.2015
comment
Я думаю, что у вас есть некоторые основные ошибки кода. Я включил исправления в качестве ответа. Попробуйте эту версию.   -  person user590028    schedule 08.02.2015


Ответы (2)


Не ответ, но слишком много для комментария. Я протестировал вашу программу на трех файлах. Первый файл test1.txt содержит текст «один».

yourprogram < test1.txt
4d5646e2
7c95787e

Идентичный файл test11.txt имеет такое же содержимое "один" и тот же результат.

yourprogram < test11.txt
4d5646e2
7c95787e

Следующий файл test2.txt содержит текст «два».

yourprogram < test2.txt
5c88c818
a93a4e42

Таким образом, ваши комментарии о том, что результат «основан на тексте команды», неверны, он работает с контентом. Возможно, вам нужен более продуманный и представленный вопрос. И ваш pastebin не содержит ничего легкодоступного.

person Weather Vane    schedule 07.02.2015
comment
Разве идентичный файл с тем же именем не давал бы одинаковый результат независимо от его содержимого, если бы он был основан на тексте из входного потока? Куда вы помещаете свои тестовые файлы? В той же папке что и программа? Это все, что нужно для команды, которую вы используете? Извините, я не знаком с командами DOS. Редактировать: и я извиняюсь за pastebins, как новый пользователь, мне разрешено публиковать только 2 ссылки, там было 4 текстовых файла. Текстовые файлы, которые я использую, тоже довольно длинные. - person Link2999; 08.02.2015
comment
О, я вижу, вы снова переименовали файл в test11.txt, а не в test1.txt. Может быть, я просто использую неправильные команды? - person Link2999; 08.02.2015

У вас были некоторые ошибки в вашем коде. Я полагаю, вы имеете в виду следующее:

#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(void){
    int s1=0, s2=0, s3=0, s4=0;
    int m1=3, m2=7, m3=13, m4=23;
    int B;
    _setmode(_fileno(stdin), _O_BINARY);

    while((B=getchar()) != EOF)
    {

       s1 = (s1 + B*m1) % 256;
       s2 = (s1+s2 + B*m2) % 256;
       s3 = (s1+s2+s3 + B*m3) % 256;
       s4 = (s1+s2+s3+s4 + B*m4) % 256;

    }
    printf("%02x%02x%02x%02x\n", s1, s2, s3, s4 );
    return 0;
}
person user590028    schedule 07.02.2015
comment
На самом деле это то, что я изначально написал, хотите верьте, хотите нет, но печать ничего не вернет. Какой должна быть команда DOS для использования текстового файла с этим кодом? У меня такое чувство, что я могу просто вводить неправильные команды. И это допустимая команда? C:\ › mdPoint ‹ file.txt Очевидно, я должен получить только один хеш для каждого файла. - person Link2999; 08.02.2015
comment
Что вы имеете в виду под ... но печать ничего не вернет .... Вы имеете в виду, что на экране нет вывода? - person user590028; 08.02.2015
comment
Ни одна команда, которую я ввожу в окно DOS, не выводит. - person Link2999; 08.02.2015
comment
Что происходит, когда вы запускаете свою программу? Просто заканчивается? - person user590028; 08.02.2015
comment
Открывается окно DOS (пустое), я набираю свою команду, затем, когда я нажимаю ввод, она переходит на новую пустую строку. Так что все еще работает, просто не дает никакого результата. - person Link2999; 08.02.2015
comment
Попробуйте нажать ‹CTRL›-D, чтобы отправить EOF. Кроме того, я не знаком с _setmode(). Что произойдет, если вы избавитесь от него? - person user590028; 08.02.2015
comment
Все еще ничего не делая. Избавление от установленного режима также не дает заметного эффекта. Я предоставил текстовые файлы, которые я пытаюсь использовать в своем исходном сообщении, попробуйте проверить их сами. Кто-то ниже сказал, что он заставил его работать так же, как и я, но я не уверен, какие команды он использовал для открытия своих файлов, возможно, я просто использую неправильные команды для открытия своих текстовых файлов. - person Link2999; 08.02.2015