Всем привет! Народ не поделитесь быстрым алгоритмом сборки байтового массива из строки (только цифры) и разборки массива в строку. К примеру: dim s as string = "11111111111111111111111111111111111" dim b as byte = {199,113,28,199,25,215,128,175,156,8,79,240,209,35,2} (прямой порядок байтов, от низшего до старшего байта).
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
Максим, нужно из байтового массива {199,113,28,199,25,215,128,175,156,8,79,240,209,35,2} получить строку/число "11111111111111111111111111111111111" и наоборот.
В соответствии с формулой, которая в первом посте. На самом деле массив "b" содержит коэффициенты разложения длинного числа/строки с основанием 2 в 8 степени. В Microsoft это называют массив байтов или байтовый массив.
Максим интересная статья. Почитал, спасибо! Но здесь проблем нет, 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
Но в итоге затрудняюсь. Байтовый массив в том виде, как вы его предложили, требует возведение 2 в 113 степень. без подключения "длинной математики" не вижу, как.
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
Если загнали в массив, то пропускаем второй байт, к примеру так:
Код
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
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄