Страницы: 1
RSS
Быстрые алгоритмы сборки байтового массива в строку и наоборот - VBA/Vb.net
 
Всем привет! Народ не поделитесь быстрым алгоритмом сборки байтового массива из строки (только цифры) и разборки массива в строку.
К примеру:
dim s as string = "11111111111111111111111111111111111"
dim b as byte = {199,113,28,199,25,215,128,175,156,8,79,240,209,35,2} (прямой порядок байтов, от низшего до старшего байта).

s->b
b->s
Алгоритм следующий:


Спасибо!
Изменено: bedvit - 11.03.2022 07:35:50
«Бритва Оккама» или «Принцип Калашникова»?
 
Параллельно на Киберфоруме
Изменено: bedvit - 19.07.2016 11:23:05
«Бритва Оккама» или «Принцип Калашникова»?
 
Не очень понял вопрос
но вот так не пойдет?
Код
Sub qqq()
Dim s As String, s1 As String
Dim b() As Byte, b1() As Byte
s = "Мама мыла раму"
Debug.Print s
s1 = "Ро"
b = s
b1 = s1
b(20) = b1(0)
b(22) = b1(2)
s = b
Debug.Print s
End Sub

в принципе вот так же работает:
Код
Dim s As String, b() As Byte
b = s
s = b
F1 творит чудеса
 
Максим, нужно из байтового массива {199,113,28,199,25,215,128,175,156,8,79,240,209,35,2}  получить строку/число "11111111111111111111111111111111111" и наоборот.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
байтового массива {199,113,28,199,25,215,128,175,156,8,79,240,209,35,2}
простите, туплю, почему это должно стать строкой "11111111111111111111111111111111111" ?
F1 творит чудеса
 
В соответствии с формулой, которая в первом посте.
На самом деле массив "b" содержит коэффициенты разложения длинного числа/строки с основанием 2 в 8 степени. :)
В Microsoft это называют массив байтов или байтовый массив.
Изменено: bedvit - 19.07.2016 18:11:01
«Бритва Оккама» или «Принцип Калашникова»?
 
2 в 8 степени это 256 (as byte)   :)
«Бритва Оккама» или «Принцип Калашникова»?
 
На самом деле путаница возникает из-за того, что вы используете термин "строка": http://www.vbstreets.ru/VB/Articles/66364.aspx
F1 творит чудеса
 
Максим интересная статья. Почитал, спасибо! Но здесь проблем нет, 127 первых символов везде одинаковы, в разных кодировках (по крайней мере в России). Цифры туда входят :)
А почему я написал строка?  - потому, что нет числа с 35 значимыми символами, кроме длинной математики реализованной программно - разрядность числа которых, превышает длину машинного слова.
Как вы запишите "число" с 35 единицами? :)
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
127 первых символов везде одинаковы
Код
Sub aaa()
    Dim b() As Byte, s As String
    s = "11"
    b = s
    Debug.Print UBound(b), b(1) '3 - 0
    s = StrConv(s, vbFromUnicode)
    b = s
    Debug.Print UBound(b), b(1) '1 - 49
End Sub
F1 творит чудеса
 
Но в итоге затрудняюсь. Байтовый массив в том виде, как вы его предложили, требует возведение 2 в 113 степень. без подключения "длинной математики" не вижу, как.
F1 творит чудеса
 
Думаю, что нужно что то типа такого:
Код
Private Declare Function CopyBytes Lib "msvbvm60.dll" Alias "__vbaCopyBytes" (ByVal ByteLen As Long, ByVal Destination As Long, ByVal Source As Long) As Long

Sub www()
    Dim a As Currency, b(7) As Byte, c
    a = CCur(String$(15, "1") & "," & String$(4, "1"))
    CopyBytes 8, VarPtr(b(0)), VarPtr(a)
    Debug.Print a
    For Each c In b
        Debug.Print c;
    Next
    Debug.Print
End Sub


использовать 35 значащих цифр не получится, но вот 18-19 - можно используя 8ми байтные целочисленные типы Currency или LongLong (в 64 разрядной версии)
 
Код
Sub aaa2()
    Dim b() As Byte, s As String
    s = "11"
    b = s
    Debug.Print b(0) '49
    Debug.Print b(2) '49
    Debug.Print Asc(Left(s, 1)) '49
    Debug.Print AscW(Left(s, 1)) '49
End Sub
Изменено: bedvit - 20.07.2016 12:44:50
«Бритва Оккама» или «Принцип Калашникова»?
 
Везде одинаков )
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, да, но b(1) будет 0, потому что Unicode
F1 творит чудеса
 
Максим Зеленский, ну все правильно :) cтрока VB - юникод.
Chr и Asc по ANSI -однобайтовые. Если в Юникоде-2 байта, вот и нолик :)
Изменено: bedvit - 20.07.2016 12:58:51
«Бритва Оккама» или «Принцип Калашникова»?
 
Ну и как вы сравниваете байт одно символа со вторым байтом другого ?)
«Бритва Оккама» или «Принцип Калашникова»?
 
Если загнали в массив, то пропускаем второй байт, к примеру так:
Код
Sub aaa3()
    Dim b() As Byte, s As String, i
    s = "11"
    b = s
    For i = 0 To UBound(b) Step 2
    Debug.Print b(i) '49 - 49
    Next
    Debug.Print Asc(Left(s, 1)) '49
    Debug.Print AscW(Left(s, 1)) '49
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
 
MCH,  ругается на VarPtr
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
ругается на VarPtr
У меня работает, win32, xl32

Результат работы:
111111111111111,1111
199  113  196  43  171  117  107  15

проверка:
?199+113*256+196*256^2+43*256^3+171*256^4+117*256^5+107*256^6+15*256^7
1,11111111111111E+18

возможно в описании функции
Destination As Long, ByVal Source As Long
вместо As Long нужно указать As LongPtr (в xl64)
 
На 32-разрядном Excel запустилось, видимо дело в .DLL
А число с 200 тыс. единиц за сколько времени разложит и соберет? :)
«Бритва Оккама» или «Принцип Калашникова»?
 
Планировал использовать этот алгоритм (формула) для больших чисел. Но по производительности - не айс, думаю над альтернативной концепцией.
Изменено: bedvit - 20.07.2016 13:49:42
«Бритва Оккама» или «Принцип Калашникова»?
 
del
Изменено: Jack Famous - 04.03.2022 14:01:28
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Читают тему
Наверх