Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Foxy29
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 15
1

Расчет контрольных сумм у файла - С/Си

28.06.2016, 07:56. Просмотров 490. Ответов 4
Метки нет (Все метки)

Всем доброго здравия.

Ребят, у меня с Си не очень, точнее сказать совсем никак. Помогите пожалуйста с кодом для следующей задачи, просмотрела где только можно и ничего не нашла.
Задача:
1) Вычислить контрольную сумму CRC32 у файла и выдать на экран в HEX-фомате
2) Вычислить контрольную сумму CRC32 заголовка в 48 байт у данного файла и выдать на экран в НЕХ-формате
3) Вычислить контрольную сумму CRC32 остальной части данного файла и выдать на экран в НЕХ-формате
4) Произвести вычисление: "CRC32 всего файла - СRC32 заголовка - CRC32 остальной части", результат выдать на экран "0" или "Ошибка"

Благодарю за помощь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2016, 07:56
Ответы с готовыми решениями:

Расчет сумм. Необходимо найти ошибку
Добрый день. Не могу решить проблемку. Как пишет borland ошибка в вычислении...

Расчет контрольных сумм
Нужно написать программу расчитывающей контрольные суммы загружаемых в нее...

Расчет контрольных сумм для ГИС ЖКХ
Добрый день уважаемые пользователи, помогите решить задачу: После генерации...

Не совпадение контрольных сумм!
Не нашел подходящего раздела, или слепой.. Вообщем скачал чистый дистрибутив...

Определение контрольных сумм ПО
Подскажите как сравнить контрольные суммы ПО? Сравнивать можно только...

4
HighPredator
5692 / 2011 / 723
Регистрация: 10.12.2010
Сообщений: 5,778
Записей в блоге: 3
28.06.2016, 10:39 2
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
 
enum
{
  no_error,
  error_file_open_fail,
  error_mem_alloc,
  error_file_read_error
};
 
struct TFileData
{
  uint32_t crc;
  uint32_t headerCrc;
  uint32_t remainderCrc;
};
 
uint32_t Crc32(const char* const buffer, const size_t bufferLength)
{
  uint32_t crc = 0;
  uint32_t remainder = 0;
 
  uint8_t octet = 0;
  
  static uint32_t lookupTable[256];
 
  static int isTableConstructed = 0;
 
  int i = 0;
  int j = 0;
 
  const char* bufferIterator = NULL;
  const char* bufferEndAddress = NULL;
 
  if (!isTableConstructed)
  {
    for (i = 0; i < 256; i++)
    {
      remainder = i;
      for (j = 0; j < 8; j++)
      {
        remainder = remainder >> 1;
 
        if (remainder & 1)
        {
          remainder = remainder ^ 0xEDB88320;
        }
      }
      lookupTable[i] = remainder;
    }
    isTableConstructed = 1;
  }
 
  crc = ~crc;
 
  bufferEndAddress = buffer + bufferLength;
  for (bufferIterator = buffer; bufferIterator < bufferEndAddress; bufferIterator++)
  {
    octet = *bufferIterator;
    crc = (crc >> 8) ^ lookupTable[(crc & 0xFF) ^ octet];
  }
 
  return ~crc;
}
 
int GetFileSize(const char* const fileName, size_t* const fileSizePtr)
{
  size_t fileSize = 0;
 
  FILE* f = fopen(fileName, "rb");
 
  if (f == NULL) return error_file_open_fail;
 
  fseek(f, 0, SEEK_END);
  fileSize = (size_t)ftell(f);
 
  fclose(f);
  *fileSizePtr = fileSize;
 
  return no_error;
}
 
int LoadFileToBuffer(const char* const fileName, char* const buffer, const size_t bufferLength)
{
  size_t bytesRead = 0;
 
  FILE* f = fopen(fileName, "rb");
 
  if (f == NULL) return error_file_open_fail;
 
  bytesRead = fread(buffer, 1, bufferLength, f);
  fclose(f);
 
  if (bytesRead != bufferLength) return error_file_read_error;
 
  return no_error;
}
 
void FillCrcData(const char* const buffer, const size_t bufferLength, struct TFileData* const crcDataPtr)
{
  crcDataPtr->crc           = Crc32(buffer, bufferLength);
  crcDataPtr->headerCrc     = Crc32(buffer, 48);
  crcDataPtr->remainderCrc  = Crc32(buffer + 48, bufferLength - 48);
}
 
void DisplayCrcData(struct TFileData* const crcDataPtr)
{
  printf("CRC data:\n"
    "total file CRC : %lX\n"
    "header CRC     : %lX\n"
    "remainder CRC  : %lX\n",
    crcDataPtr->crc,
    crcDataPtr->headerCrc,
    crcDataPtr->remainderCrc);
}
 
int ProcessFile(const char* const fileName, struct TFileData* const crcDataPtr)
{
  int errorCode = no_error;
 
  size_t fileSize = 0;
 
  char* buffer = NULL;
 
  errorCode = GetFileSize(fileName, &fileSize);
 
  if ((errorCode == no_error) && (fileSize > 0))
  {
    buffer = malloc(fileSize);
 
    if (buffer != NULL)
    {
      errorCode = LoadFileToBuffer(fileName, buffer, fileSize);
 
      if (errorCode == no_error) FillCrcData(buffer, fileSize, crcDataPtr);
    }
    else errorCode = error_mem_alloc;
  }
 
  return errorCode;
}
 
int main(void)
{
  struct TFileData fileData;
 
  ProcessFile("input.txt", &fileData);
 
  DisplayCrcData(&fileData);
 
  return 0;
}
П 4 совсем не понял, поясните, что требуется.
0
Foxy29
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 15
28.06.2016, 13:24  [ТС] 3
Цитата Сообщение от HighPredator Посмотреть сообщение
П 4 совсем не понял, поясните, что требуется.
Сделать вычитание: от CRC32 всего файла Отнять СRC32 заголовка Отнять CRC32 остальных данных. В результате должен получится "0" (хотя он и так получится) и его вывести на экран, а есом "0" не получится то вывести "Ошибка".
Честно сказать я сама не поняла логики последнего пункта, так как если от целого отнять часть, а потом отнять остальное то в результате всегда будет "0". Но у меня так в задании напичано, что если "0" не получается, то вывести "Ошибка", если не "0". Хотела бы я спросить у того умника кто составил такое задание...
0
HighPredator
5692 / 2011 / 723
Регистрация: 10.12.2010
Сообщений: 5,778
Записей в блоге: 3
28.06.2016, 14:48 4
Цитата Сообщение от Foxy29 Посмотреть сообщение
Честно сказать я сама не поняла логики последнего пункта, так как если от целого отнять часть, а потом отнять остальное то в результате всегда будет "0". Но у меня так в задании напичано, что если "0" не получается, то вывести "Ошибка", если не "0". Хотела бы я спросить у того умника кто составил такое задание...
Я вас видимо повеселю, но или я криво запрограммировал црц или я чего-то не знаю. В общем у меня как раз ошибка и выходит

Добавлено через 23 минуты
Короче я понял, что у меня не хватает знаний, чтобы однозначно установить, верно ли вычислять разность контрольных сумм, получаемых от данных моим способом. Может быть данные тоже нужно для этого как-то подготавливать (типа дополнения буферов нулями или типа того).
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
28.06.2016, 16:44 5
например
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stddef.h>
#include <stdint.h>
uint_least32_t Crc32(unsigned char *buf, size_t len)
{
    uint_least32_t crc_table[256];
    uint_least32_t crc; int i, j;
 
    for (i = 0; i < 256; i++)
    {
        crc = i;
        for (j = 0; j < 8; j++)
            crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1;
 
        crc_table[i] = crc;
    };
 
    crc = 0xFFFFFFFFUL;
 
    while (len--)
        crc = crc_table[(crc ^ *buf++) & 0xFF] ^ (crc >> 8);
 
    return crc ^ 0xFFFFFFFFUL;
}
открываем файл, читаем 48 байт
вот стандартный образец чтения из файла:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FILE* fp = fopen("test.txt", "r");
    if(!fp) {
        perror("File opening failed");
        return EXIT_FAILURE;
    }
 
    int c; // note: int, not char, required to handle EOF
    while ((c = fgetc(fp)) != EOF) { // standard C I/O file reading loop
       //putchar(c);
    }
 
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
 
    fclose(fp);
затем читаем пока не EOF
а вообще-то сие еще и от аппаратной платформы зависит, тк CRC32 реализован в большинстве современных Intel, также как и шифрование и математические функции типа логарифма, косинуса и тп
CRC32 instruction for 64-bit source operand and 64-bit destination operand:
Assembler
1
2
3
4
5
6
7
8
TEMP1[63-0] <- BIT_REFLECT64 (SRC[63-0])
TEMP2[31-0] <- BIT_REFLECT32 (DEST[31-0])
TEMP3[95-0] <- TEMP1[63-0] « 32
TEMP4[95-0] <- TEMP2[31-0] « 64
TEMP5[95-0] <- TEMP3[95-0] XOR TEMP4[95-0]
TEMP6[31-0] <- TEMP5[95-0] MOD2 11EDC6F41H
DEST[31-0] <- BIT_REFLECT (TEMP6[31-0])
DEST[63-32] <- 00000000H
CRC32 instruction for 32-bit source operand and 32-bit destination operand:
Assembler
1
2
3
4
5
6
7
TEMP1[31-0] <- BIT_REFLECT32 (SRC[31-0])
TEMP2[31-0] <- BIT_REFLECT32 (DEST[31-0])
TEMP3[63-0] <- TEMP1[31-0] « 32
TEMP4[63-0] <- TEMP2[31-0] « 32
TEMP5[63-0] <- TEMP3[63-0] XOR TEMP4[63-0]
TEMP6[31-0] <- TEMP5[63-0] MOD2 11EDC6F41H
DEST[31-0] <- BIT_REFLECT (TEMP6[31-0])
CRC32
CRC32
0
28.06.2016, 16:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2016, 16:44

Калькулятор контрольных сумм
нужно окно в которое я ввожу данные, стартовое слово, жму кнопку и мне...

Теоретическое обоснование контрольных сумм
Подскажите, пожалуйста, книги, где приводится теоретическое обоснование...

Подходит ли Murmur для вычисления контрольных сумм?
Ищу алгоритм для вычисления контрольных сумм, раньше никогда не сталкивался с...


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

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

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