长十六进制值拆分为2个字节的十六进制值或4个字节的十六进制值,然后使用VB.Net将其转换为十进制(浮点)值

时间:2018-08-19 08:32:34

标签: vb.net

我想将长数组拆分为2个字节(4位十六进制)或4个字节(8位十六进制)。如果c值为1,我想获得2个字节(4位十六进制)的十六进制数组,如果c值为0,我想从一个长的十六进制字符串中获取4个字节(8位十六进制)的HEX数组。

之后,我想在将2byte或4byte转换为浮点数(十进制数)时进行转换。

我有4个字节到十进制值的代码。

Dim bytes() As Byte = {&H43, &H62, &HD3, &HE}

If BitConverter.IsLittleEndian Then
    Array.Reverse(bytes)

End If
Dim myFloat As Decimal = BitConverter.ToSingle(bytes, 0)
txt4.Text = myFloat

请提供此功能的代码。

示例:

十六进制值长-4362D30EFFC00000FFC00000FFFFFFFF

如果C为1,请分割4位数的十六进制值。

4362 

然后转换为十进制。

17250

重新分割4位十六进制值。

D30E

然后转换为十进制

-11506

如果c为0,请分割8位十六进制值。

4362D30E 

然后转换为十进制

226.824432

请对此提供帮助。我对VB.Net不太了解

1 个答案:

答案 0 :(得分:0)

我也将对此进行介绍,但请考虑一下我在您的新问题上所说的话。

要读取一定数量的字节并将其最好地转换为数字,就是使用BitConverter及其To***方法。

这是每种数字数据类型使用多少个字节:

  • Double:8个字节
  • Int16 / UInt16 / Short / UShort:2个字节
  • Int32 / UInt32 / Integer / UInteger:4个字节
  • Int64 / UInt64 / Long / ULong:8个字节
  • Single:4个字节

考虑到这一点,您所需要做的只是根据要读取的字节数来确定数据类型,然后在数组中指定要从其开始读取的索引。

请记住,如果反转数组,则必须从数组末尾开始读取。

Dim StartIndex As Integer = 0
Dim EndIndex As Integer = bytes.Length - 1

'How many bytes to read: 2 or 4.
Dim BytesPerStep As Integer = If(C = 1, 2, 4)

'If the system uses little endianness we need to reverse the array and loop backwards.
If BitConverter.IsLittleEndian Then
    'Reverse the array.
    Array.Reverse(bytes)

    'Swap start and end index.
    StartIndex = EndIndex
    EndIndex = 0

    'Negate BytesPerStep: Go backwards.
    BytesPerStep = -BytesPerStep
End If

'Iterate the array <BytesPerStep> bytes at a time.
For i = StartIndex To EndIndex Step BytesPerStep
    If C = 1 Then
        'Read two bytes = Short (Int16).
        ListBox1.Items.Add(BitConverter.ToInt16(bytes, i))
    Else
        'Read four bytes = Single (Float)
        ListBox1.Items.Add(BitConverter.ToSingle(bytes, i))
    End If
Next