Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. mordor2001

    mordor2001 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2023
    Сообщения:
    1
  2. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    141
  3. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    562
    В хеш МД5 есть таблица констант, целых 64 штуки. Использую С++, студия2010. Как в классе объявить массив констант внутри самого класса?
    const uint32_t T[64] = {...далее константы
    В общем, студия запрещает инициализировать данные в классе.
    Зачем константы помещены в таблицу не просто объявлены #define или просто const int T1 = ...?
    Это надо не только для х86, но и для АРМ процессоров, у них проблемы к большими константами, в результате компилятор нагородить такой огород, что код будет работать в несколько раз медленней. А так, оптимизатор на х86 создаст константу непосредственно в коде, а для АРМ создаст таблицу.
    Если это не возможно, то придётся объявить таблицу вне класса, да и всё, но это уже не ООП.
    --- Сообщение объединено, 13 ноя 2023 ---
    И ещё, а можно создать оператор >>> и <<< для циклического вращения в С++?
    --- Сообщение объединено, 13 ноя 2023 ---
    Хотя если сделать так: enum {T0 = , T1 = ... Возможно умный компилятор сумеет догадаться создать таблицу, но это надо экспериментировать с компиляторами ARM др. RISC процессорами. Правда это сложно, только с эмуляторами, или удалённо, в общем сложно.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.331
    ООП не значит, что все надо в класс запихать. Объявляй массив снаружи класса в cpp-файле, и не забудь static добавить, чтобы твой T наружу не торчал.
     
  5. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    562
    Тупанул! Надо объявлять прямо внутри метода md5_process: static const uint32_t T[64] = {...
    Тогда всё работает, и буква Т, имя таблицы, не забивает проект.
     
    Последнее редактирование: 13 ноя 2023
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    Можно так:
    Код (C++):
    1.  
    2. class Klass
    3. {
    4.     static constexpr int k_consts[]
    5.     {
    6.         10, 20, 30, 40
    7.     };
    8. };
    9.  
     
  7. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    562
    HoShiMin, хорошо. Но у меня Т должно видно только методу Process, там где используется. А так, на будущие учтём.
    --- Сообщение объединено, 14 ноя 2023 ---
    HoShiMin, в VS2010 эта шняга не работает, у меня старая студия со старым стандартом.
     
  8. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    562
    Есть код:
    Код (C++):
    1. //Test MD5  v0.02
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <time.h>
    5. #include "md5.cpp"
    6. int main(int argc, const char *argv[])
    7. {
    8.     if (argc < 2){
    9.         printf("Usage: file_name [count_test]\n");
    10.         return 1;
    11.     }
    12.     FILE*   pFile = fopen(argv[1], "rb");
    13.     if (!pFile){
    14.         printf("Can't open this '%s' file.\n", argv[1]);
    15.         return 1;
    16.     }
    17.     fseek(pFile, 0, SEEK_END);
    18.     size_t  SizeFile = ftell(pFile);
    19.     fseek(pFile, 0, SEEK_SET);
    20.     printf("File '%s', size = %d\n", argv[1], SizeFile);
    21.     char*   pBuf = new char[SizeFile];
    22.     if (pBuf==NULL){
    23.         printf("Memory allocation error, the request was %u bytes.\n", SizeFile);
    24.         return 1;
    25.     }
    26.     size_t  res = fread(pBuf, 1, SizeFile, pFile);
    27.     if (res != SizeFile){
    28.         printf("Error reading the file. res = %u\n", res);
    29.         return 1;
    30.     }
    31.     fclose(pFile);
    32.     CHashMD5    hashMD5 = CHashMD5();
    33.     unsigned char   sHash[33];
    34.     int CntTest = 0;
    35.     if (argc>=3) CntTest = atoi(argv[2]);
    36.     if (CntTest>12) CntTest = 12;   //макс. количество тестов
    37.     double  LST[12];
    38.     for (int i=0; i<(CntTest<=0 ? 1 : CntTest); i++){
    39.         clock_t tm = clock();
    40.         hashMD5.Init();
    41.         hashMD5.Update(pBuf, SizeFile);
    42.         hashMD5.GetHashStr(sHash);
    43.         LST[i] = (double)(clock()-tm) / CLOCKS_PER_SEC;
    44.     }
    45.     printf("MD5: %s\n", sHash);
    46.     for (int i=0; i<CntTest; i++)
    47.         printf("[%02d] ExeTime: %.3f sec, Speed: %.0f bytes/sec\n", i+1, LST[i], SizeFile/LST[i]);
    48.     delete  []pBuf;
    49.     return 0;
    50. }
    Надо перегнать в питухоний 2.7 . Файл md5.cpp кое как сам перегнал(правда не знаю, правильно ли), точней конверторами, правда они лимитные, и это код я не успел перегнать.
    print("2+2=", 2+2) я ещё понимаю, но остальное меня загоняет в тупик. Я же говорю питухоний сложный ЯП, сложней С/С++.
     
  9. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    347
    а чего на 2.7? оно же умерло 10 лет тому...
     
  10. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    562
    alex_dz, другого нет. Это автоматическая установка VS2010. Надо отдельно устанавливать, код вроде для 2.7 работает, наверное, но будет ли работать с 3.6? Проблема питухония это гемор с версиями. Работал код, работал, и вдруг эти критины всё поломали, да, только критины работают над питухонием, т.к. делают в основном для критинов.
    --- Сообщение объединено, 16 ноя 2023 ---
    Что-то не работает. Питухоний 3.12 не работает, вот код С++.
    Код (C++):
    1.  
    2.     __inline u32 ROL(u32 r, u8 n){
    3.         return (r << n) | (r >> (32 - n));
    4.     };
    5.     __inline void ROUND1(u32 *a, u32 b, u32 c, u32 d, u32 X, u8 s, u32 Ti){
    6.         *a = ROL(*a + ((b & c) | (~b & d)) + X + Ti, s) + b;
    7.     };
    8.  
    Код (Python):
    1.  
    2.     def ROL(r, n):
    3.         return (r << n) | (r >> (32 - n))
    4.     #end
    5.     def ROUND1(self, a, b, c, d, X, s, Ti):
    6.         a[0] = self.ROL(a[0] + ((b & c) | (~b & d)) + X + Ti, s) + b
    7.     #end
    8.  
    Ругается на:
    File "D:\assemblers\my_projects\md5\Pytuhon\MD5.py", line 22, in ROUND1
    a[0] = self.ROL(a[0] + ((b & c) | (~b & d)) + X + Ti, s) + b
    TypeError: 'int' object is not subscriptable
    Или по ссылке в питухонии нельзя данные возвращать? Надо типа так делать.
    def ROUND1(self, a, b, c, d, X, s, Ti):
    return self.ROL(a + ((b & c) | (~b & d)) + X + Ti, s) + b
    и далее так
    a = self.ROUND1(a, b, c, d, X[0], 7, T[0])
    Может и заработает.
     
  11. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    Intro,
    Код (Python):
    1.  
    2. import hashlib
    3.  
    4. def md5(fname):
    5.     hash_md5 = hashlib.md5()
    6.     with open(fname, "rb") as f:
    7.         for chunk in iter(lambda: f.read(4096), b""):
    8.             hash_md5.update(chunk)
    9.     return hash_md5.hexdigest()
    10.    
    11. print(md5("file.txt"))
    12.  
    --- Сообщение объединено, 16 ноя 2023 ---
    Лучше напиши пример твоих данных, которые надо прохэшировать. Так будет проще, чем переводить сишный код один к одному
     
  12. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    562
    По ссылке не получается данные передавать, ну и ладно, код переделал, этот баг устранён. Но вылезли новые баги, так что завтра.
    И да, я знаю что в питухонии хеш можно из библиотеки взять, но мне надо просто сложным кодом питухоний протестировать, + ещё ковыряя реальный код можно как-то освоить ЯП, просто чтение талмудов ничего не даст.
     
  13. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    Кстати, оцени, насколько короче вариант на питоне. У тебя одно только получение размера файла заняло три системных вызова на три строчки…
    А pBuf на NULL можно не проверять, поскольку new никогда его не вернёт. Он или вернёт память, или, если её не хватает, выбросит исключение. Чтобы вместо исключения возвращал NULL, делай так:
    Код (C++):
    1.  
    2. char* pBuf = new (std::nothrow) char[SizeFile];
    3.