Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <ctime>
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <string>
- using namespace std;
- string GetNSizeHexNumber(int nuber_size) {
- string number;
- const int NUBER_SYSTEM = 16;
- vector<char> digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
- for (int i = 0; i < nuber_size; ++i) {
- number += digits[rand() % NUBER_SYSTEM];
- }
- return number;
- }
- void FillFile(int number_size, const string& file_name) {
- string number = GetNSizeHexNumber(number_size);
- ofstream fout(file_name, std::ios::binary);
- fout << number;
- fout.close();
- }
- int main() {
- srand(time(0));
- //читаем количество разрядов, размер" числа
- int number_size;
- cin >> number_size;
- const string SOURCE_FILE_NAME = "Finp.bin";
- //генерируем и записываем в файл number_size-рязрядное число
- FillFile(number_size, SOURCE_FILE_NAME);
- //так как 16-ричное число включает в себя символы, и может не поместиться в целочисленный тип - читаем его в строку
- string number;
- ifstream fin("Finp.bin", ios::binary);
- if (!fin.is_open()) {
- cout << "failed to open " << SOURCE_FILE_NAME << '\n';
- return -1;
- } else {
- fin >> number;
- }
- fin.close();
- cout << number << '\n';//для отладки
- //Тут нужна проверка, что число поместится в uint64_t
- //Берем максимальное число в 10системе счисления, которое помещается в uint64_t - 18 446 744 073 709 551 615
- //Переводим его в 16ричную систему счисления - FFFFFFFFFFFFFFFF
- //Сохраняем в строку и сравниваем строки.
- //Если число, которое мы сгенерировал больше - мы не сможем его преобразовать
- const string max_number = "FFFFFFFFFFFFFFFF";
- if (max_number.size() < number.size() || max_number < number) {
- cout << "number is too large\n";
- return 0;
- }
- //переводим число в 10-ричную систему счисления
- //тут немного магии, можно переписать более хардкодно, но понятнее.
- //Тут подготавливаем массив в котором по индексу из acii таблицы для чаров - будут лежать значения
- //В tr_str_to_hex['0'] - будет лежать число 0. В tr_str_to_hex['a'] - будет лежать число 10.s
- char tr_str_to_hex[256] = { 0 };
- const char tmp[] = "0123456789abcdef";
- for (int i = 0; i < sizeof(tmp); ++i) {
- tr_str_to_hex[tmp[i]] = i;
- }
- uint64_t result = 0;
- size_t n = number.size();
- for (int i = 0; i < n; ++i) {
- //Эквивалентно result *= 16;
- result <<= 4;
- //Эквивалентно result += tr_str_to_hex[number[i]];
- //number[i] - очередной символ из числа в формате строки, tr_str_to_hex[number[i]] - десятичное число соответствующее цифре из 16ричной системы
- result |= tr_str_to_hex[number[i]];
- }
- cout << result << '\n';//для отладки
- //Перевод числа в восьмеричную систему счисления.
- //Число в 8ричной системе будет длиннее чем в 10ричной, снова может не поместиться в тип,
- //поэтому сохраним его в виде строки.
- string n_in_o; //number in the octal number system
- if (result == 0) {
- n_in_o = "0";
- }
- while (result) {
- //n_in_o += char('0' + (result % 8));
- n_in_o.push_back(char('0' + (result & 7)));
- //result /= 8;
- result >>= 3;
- }
- reverse(n_in_o.begin(), n_in_o.end());
- //запись числа в файл
- const string DESTINATION_FILE_NAME = "Fout.bin";
- ofstream fout(DESTINATION_FILE_NAME, std::ios::binary);
- fout << n_in_o;
- fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement