LenB实际上对无字符串参数做了什么

时间:2009-02-24 21:00:53

标签: vb.net vb6

我有一些代码正在从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

我是否认为字节总是ReDim到相同的大小?通过它的外观4个元素。

如果你可以使用一个数字,为​​什么然后使用LenB到ReDim?为什么ReDim在循环中呢?

2 个答案:

答案 0 :(得分:4)

LenB()返回变量的字节长度。最常见的示例是字符串,它以字节为单位返回字符串的大小而不是字符数,而不管字符编码如何。对于其他类型,它返回一个对象的大小 - 一个对象的大小4.他们这样做的原因是,如果未来的Visual Basic版本改变了单个的大小,他们希望代码能够存活(没关系)在分配给字节数组时对数字4进行硬编码。)

将LenB()升级到.Net时,对于字符串,使用System.Text.Encoding.Unicode.GetBytes()来获取已填充字符串文本字节的数组。请记住.Net始终在内部使用Unicode作为字符串。如果您确实需要不同的编码,则Encoding命名空间中有许多替代方法。对于其他类型,请使用BitConverter类。无论哪种方式,不要一行一行,因为较新的方法带走了许多忙碌的工作。

在这里 - 我会帮你解决一些转换问题:

(早期)

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()方法,{ {1}}和标准格式字符串,所有这些字符串都旨在替换vb6中的构造或技术。

答案 1 :(得分:3)

试图解释不良代码......只是徒劳无功。 通过加载字节数组来填充Single的有趣方法。

LenB函数为您提供变量的字节长度。 是的,当传递单变量类型时,它总是返回4。

我对redim的猜测是,数组被初始化而不是保留。 但由于它随后分配了所有4个字节,因此在技术上并不需要,而且可能只是防御性编程。防御性编程也可能解释LenB。如果Single将来改变大小。