Что на самом деле делает LenB без строковых параметров - PullRequest
1 голос
/ 25 февраля 2009

У меня есть этот бит кода, который конвертируется из vb6 в vb.net. Мне нужно знать, что делает LenB в этом кусочке кода.

Dim singleValue As Single 'var for conversion use(4byte -> 1single)'
Dim bytes() As Byte
Dim valueB() As Byte 'this gets set elsewhere and is redim-d to its size'

For n = 0 To CDbl(ItemNumberCombo.Text) - 1
    'bytes() -> single'
    'UPGRADE_ISSUE: LenB function is not supported.'
    ReDim bytes(LenB(singleValue) - 1)
    bytes(3) = valueB(n * 4)
    bytes(2) = valueB(n * 4 + 1)
    bytes(1) = valueB(n * 4 + 2)
    bytes(0) = valueB(n * 4 + 3)
    'UPGRADE_ISSUE: LenB function is not supported.'
    'UPGRADE_ISSUE: VarPtr function is not supported. '
    Call memcpy(VarPtr(singleValue), VarPtr(bytes(0)), LenB(singleValue))
    'display the result'
    DText(n).Text = VB6.Format(singleValue, "0.000000E+00") 'CStr(singleValue)'
    If DataSaveCheckBox.CheckState = 1 And FileNameText.Text <> "" Then
        csvOutput = csvOutput & DText(n).Text & ","
    End If
Next n

Правильно ли я считаю, что байты всегда передаются одинакового размера? Судя по всему, 4 элемента.

Зачем тогда использовать LenB для ReDim, если вы можете просто использовать число? И почему ReDim в цикле вообще?

Ответы [ 2 ]

4 голосов
/ 25 февраля 2009

LenB () возвращает длину в байтах переменной. Наиболее распространенный пример - для строк, где он возвращает размер строки в байтах, а не количество символов, независимо от кодировки символов. Для других типов он возвращает размер объекта - размер одного существа 4. Причина, по которой они это сделают, заключается в том, что они хотели, чтобы код выживал, если будущая версия Visual Basic когда-либо изменит размер одного (не говоря уже о жесткое кодирование числа 4 при присваивании байтовому массиву).

При обновлении LenB () до .Net для строк используйте System.Text.Encoding.Unicode.GetBytes(), чтобы получить массив, уже заполненный байтами текстовой строки. Помните, что .Net всегда использует Юникод для внутренних строк. Если вам действительно нужна другая кодировка, в пространстве имен Encoding есть несколько альтернатив. Для других типов используйте класс BitConverter. В любом случае, не ходите построчно, так как новые методы отнимают большую часть занятой работы.

Здесь & mdash; Я помогу вам с преобразованием некоторых:

(ранее)

Dim csvOutput As New StringBuilder()

(позже)

Dim valueB() As Byte 'this gets set elsewhere and is redim-d to its size'
Dim singleValue As Single 'var for conversion

' Included because the original developer was concerned the size of a single could change
Dim singleSize As Integer = BitConverter.GetBytes(singleValue).Length 

Dim NumberItems As Double
If Double.TryParse(ItemNumberCombo.Text, NumberItems) Then
    For n As Integer = 0 To NumberItems - 1
        singleValue = BitConverter.ToSingle(valueB, n * singleSize)

        'display the result
        DText(n).Text = singleValue.ToString("E6") 'CStr(singleValue)
        If DataSaveCheckBox.CheckState = 1 AndAlso Not String.IsNullOrEmpty(FileNameText.Text) Then
            csvOutput.Append(DText(n).Text & ",")
        End If
    Next n
Else
    ' Handle Invalid ComboBox value here- may not be an issue for you
End If

Обратите внимание, что этот код также демонстрирует StringBuilder как намного лучший способ построения ваших данных CSV, оператор AndAlso, методы .TryParse(), String.IsNullOrEmpty() и строки стандартного формата все они предназначены для замены конструкций или методов из vb6.

3 голосов
/ 25 февраля 2009

Попытка объяснить плохой код ... это просто тщетная попытка. Интересный способ заполнить сингл, загрузив байтовый массив.

Функция LenB дает вам длину в байтах переменной. Да, он всегда будет возвращать 4 при передаче типа Single.

Я думаю, что для redim массив инициализируется, а не сохраняется. Но поскольку он затем назначает все 4 байта, это технически не требуется и, вероятно, является просто защитным программированием. Оборонительное программирование также может объяснить ЛенБ. В случае, если Single изменит размер в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...