|
|
||||||
Быстрые алгоритмы сборки байтового массива в строку и наоборот19.07.2016, 12:28. Показов 2898. Ответов 50
Метки нет (Все метки)
Всем привет! Народ не поделитесь быстрым алгоритмом сборки байтового массива из строки (только цифры) и разборки массива в строку?
К примеру:
s->b b->s Пишу на Vb, но и в С#разберусь, если будет алгоритм. Спасибо!
0
|
||||||
| 19.07.2016, 12:28 | |
|
Ответы с готовыми решениями:
50
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
|||||||||||
| 19.07.2016, 13:31 | |||||||||||
|
Можно сделать, к примеру, вот так:
Добавлено через 4 минуты Обратно:
1
|
|||||||||||
|
|
|
| 19.07.2016, 14:02 [ТС] | |
|
Именно от BigInteger и хотел отказаться
А так же от BitConverter . GetBytes.Ибо на больших массивах, как мне показалось работает не настолько быстро, как хотелось. Свои алгоритмы пока успеха не принесли, вот и решил обратится к форуму. Добавлено через 33 секунды Но за ответ +Спасибо!
0
|
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
|
| 19.07.2016, 14:36 | |
|
Большие числа приходится по многу раз делить и умножать, вот оно и считается долго.
Можно попробовать вручную реализовать длинную арифметику: Википедия: Позиционная система счисления/Переход к другому основанию /Перевод в десятичную систему счисления Только сомневаюсь, что это будет быстрее. Добавлено через 4 минуты Вот такое ещё нашлось: Википедия: Длинная арифметика/Алгоритмы преобразования системы счисления Так что некоторый шанс ускорить код всё же есть (если авторы .NET выбрали для BigInteger неоптимальные алгоритмы)
0
|
|
|
296 / 259 / 107
Регистрация: 26.10.2012
Сообщений: 809
|
||||||
| 19.07.2016, 14:45 | ||||||
|
Так как-то наверное
символы '0'-'9' кодируются в байты {48, 0} - {57, 0} поэтому изменяем только четные байты массива
0
|
||||||
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
|
| 19.07.2016, 14:52 | |
|
jetyb, эти функции дадут совершенно другой результат.
bedvit, обязательно использовать именно десятичную систему счисления? для двоичной или восьмеричной, к примеру, можно сделать намного более быстрое решение.
0
|
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
||||||
| 19.07.2016, 15:35 | ||||||
|
Если всё равно что будет в массиве, тогда достаточно написать
Можно ещё в два раза сжать - но будет чуть дольше.
0
|
||||||
|
|
|
| 19.07.2016, 16:06 [ТС] | |
|
Vort_, Спасибо! Попробовал. Прошу прощения, но видимо я вас ввел в заблуждение, видимо без десятичной системы не обойтись - дальше с массивом планируется математика. На самом деле массив "b" содержит коэффициенты разложения длинного числа/строки с основанием 28. Поскольку со степенью двойки легче работать на низком уровне (умножение и деление на степень двойки соответствует битовым сдвигам влево и вправо)
Добавлено через 7 минут Для понимания: вообщем-то я делаю математику для объекта похожего на структуру BigInteger, но с другим основанием и своими методами и свойствами.
0
|
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
||
| 19.07.2016, 16:22 | ||
|
Если же имеется в виду основание входных и выходных данных (строки), то его поддержку вполне можно добавить к уже существующему коду BigInteger (сделав наследника класса, к примеру). Туда же можно дописать и новые, специфичные, методы.
0
|
||
|
|
|
| 19.07.2016, 16:43 [ТС] | |
|
BigInteger это структура, у структуры нет наследников
(насколько я знаю)BigInteger сидит на основании 232 Для 64-х разрядной структуры оптимальное основание будет 264. +быстрее. Добавлено через 36 секунд Если только делать интерфейсы, но это не подходит. Добавлено через 9 минут Если интересно: https://habrahabr.ru/post/207754/
0
|
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
|||
| 19.07.2016, 16:49 | |||
![]() Reference Source: BigInteger.cs
1
|
|||
|
|
|
| 19.07.2016, 18:06 [ТС] | |
|
Надо же, открытая инфа, я думал это закрытий-лицензионный продукт.
Поэтому пришлось тупо декомпелировать из системы (.NET Reflector в помощь) Зато сразу в VB.NET, С# - похуже знаю. За ссылку спасибо, пригодится! Кода много, решил что сам быстрее соберу, зная принципы. Добавлено через 47 минут Но быстрым этот процесс не назовешь, + думал с помощью форума пойдет побыстрее
0
|
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
|
| 19.07.2016, 18:14 | |
|
0
|
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
|
| 19.07.2016, 18:20 | |
|
Я, кстати, вижу ещё два варианта.
1. Поискать сторонние .NET библиотеки для длинной арифметики. Учитывая, что уже есть BigInteger - врядли кто-то будет такое создавать. Но мало ли. 2. Найти C++ библиотеки и постараться их подключить к .NET`у. Может стать быстрее, может медленнее. Но явно ухудшится переносимость программы.
0
|
|
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
||||||||||||||||
| 20.07.2016, 08:19 | ||||||||||||||||
Сообщение было отмечено bedvit как решение
Решение
Вот пример моего пункта #2:
Mpir.NET
Похоже, это решение - то, что надо. Я сделал тестовую программу. На ней Mpir показывает скорость в 100 раз большую, чем BigInteger.
0
|
||||||||||||||||
|
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
||
| 20.07.2016, 10:36 | ||
mpn\generic\set_str.c и mpn\generic\mul.c.Тут и без ассемблерных вставок разобраться непросто. Я, к примеру, стал бы в этом копаться только при очень большой необходимости.
0
|
||
| 20.07.2016, 10:36 | |
|
Помогаю со студенческими работами здесь
20
Неверное отображение байтового массива Преобразование динамического байтового массива в SafeArray Создание байтового массива с помощью MemCopy, RtlMoveMemory
Не работает код (программа считывает из файла строку, убирает лишние пробелы и записывает в другой файл строку, словами наоборот) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|