Advertisement
Derga

Untitled

May 12th, 2023 (edited)
669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.41 KB | None | 0 0
  1. #include <algorithm>
  2. #include <ctime>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <vector>
  6. #include <string>
  7.  
  8. using namespace std;
  9.  
  10. string GetNSizeHexNumber(int nuber_size) {
  11.     string number;
  12.     const int NUBER_SYSTEM = 16;
  13.     vector<char> digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  14.     for (int i = 0; i < nuber_size; ++i) {
  15.         number += digits[rand() % NUBER_SYSTEM];
  16.     }
  17.     return number;
  18. }
  19.  
  20. void FillFile(int number_size, const string& file_name) {
  21.     string number = GetNSizeHexNumber(number_size);
  22.     ofstream fout(file_name, std::ios::binary);
  23.     fout << number;
  24.     fout.close();
  25. }
  26.  
  27. int main() {
  28.     srand(time(0));
  29.  
  30.     //читаем количество разрядов, размер" числа
  31.     int number_size;
  32.     cin >> number_size;
  33.     const string SOURCE_FILE_NAME = "Finp.bin";
  34.  
  35.     //генерируем и записываем в файл number_size-рязрядное число
  36.     FillFile(number_size, SOURCE_FILE_NAME);
  37.  
  38.     //так как 16-ричное число включает в себя символы, и может не поместиться в целочисленный тип - читаем его в строку
  39.     string number;
  40.     ifstream fin("Finp.bin", ios::binary);
  41.     if (!fin.is_open()) {
  42.         cout << "failed to open " << SOURCE_FILE_NAME << '\n';
  43.         return -1;
  44.     } else {
  45.         fin >> number;
  46.     }
  47.     fin.close();
  48.     cout << number << '\n';//для отладки
  49.  
  50.     //Тут нужна проверка, что число поместится в uint64_t
  51.     //Берем максимальное число в 10системе счисления, которое помещается в uint64_t - 18 446 744 073 709 551 615
  52.     //Переводим его в 16ричную систему счисления - FFFFFFFFFFFFFFFF
  53.     //Сохраняем в строку и сравниваем строки.
  54.     //Если число, которое мы сгенерировал больше - мы не сможем его преобразовать
  55.     const string max_number = "FFFFFFFFFFFFFFFF";
  56.     if (max_number.size() < number.size() || max_number < number) {
  57.         cout << "number is too large\n";
  58.         return 0;
  59.     }
  60.  
  61.     //переводим число в 10-ричную систему счисления
  62.     //тут немного магии, можно переписать более хардкодно, но понятнее.
  63.     //Тут подготавливаем массив в котором по индексу из acii таблицы для чаров - будут лежать значения
  64.     //В tr_str_to_hex['0'] - будет лежать число 0. В tr_str_to_hex['a'] - будет лежать число 10.s
  65.     char tr_str_to_hex[256] = { 0 };
  66.     const char tmp[] = "0123456789abcdef";
  67.     for (int i = 0; i < sizeof(tmp); ++i) {
  68.         tr_str_to_hex[tmp[i]] = i;
  69.     }
  70.  
  71.     uint64_t result = 0;
  72.     size_t n = number.size();
  73.     for (int i = 0; i < n; ++i) {
  74.         //Эквивалентно result *= 16;
  75.         result <<= 4;
  76.  
  77.         //Эквивалентно result += tr_str_to_hex[number[i]];
  78.         //number[i] - очередной символ из числа в формате строки, tr_str_to_hex[number[i]] - десятичное число соответствующее цифре из 16ричной системы
  79.         result |= tr_str_to_hex[number[i]];
  80.     }
  81.     cout << result << '\n';//для отладки
  82.  
  83.     //Перевод числа в восьмеричную систему счисления.
  84.     //Число в 8ричной системе будет длиннее чем в 10ричной, снова может не поместиться в тип,
  85.     //поэтому сохраним его в виде строки.
  86.     string n_in_o; //number in the octal number system
  87.     if (result == 0) {
  88.         n_in_o = "0";
  89.     }
  90.     while (result) {
  91.         //n_in_o += char('0' + (result % 8));
  92.         n_in_o.push_back(char('0' + (result & 7)));
  93.         //result /= 8;
  94.         result >>= 3;
  95.     }
  96.     reverse(n_in_o.begin(), n_in_o.end());
  97.  
  98.     //запись числа в файл
  99.     const string DESTINATION_FILE_NAME = "Fout.bin";
  100.     ofstream fout(DESTINATION_FILE_NAME, std::ios::binary);
  101.     fout << n_in_o;
  102.     fout.close();
  103.  
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement