我有一些代码正在从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在循环中呢?
答案 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将来改变大小。