Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何将两个字节转换为浮点数_Vb.net_Floating Point_Binary - Fatal编程技术网

Vb.net 如何将两个字节转换为浮点数

Vb.net 如何将两个字节转换为浮点数,vb.net,floating-point,binary,Vb.net,Floating Point,Binary,我有一些遗留文件需要挖掘数据。这些文件是由Lotus123 Release4 for DOS创建的。我试图通过解析字节而不是使用Lotus打开文件来更快地读取文件 Dim fileBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(fiPath) 'I loop through all the data getting first/second bytes for each value do ... Dim FirstByte A

我有一些遗留文件需要挖掘数据。这些文件是由Lotus123 Release4 for DOS创建的。我试图通过解析字节而不是使用Lotus打开文件来更快地读取文件

Dim fileBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(fiPath)

'I loop through all the data getting first/second bytes for each value
do ...
    Dim FirstByte As Int16 = Convert.ToInt16(fileBytes(Index))
    Dim SecondByte As Int16 = Convert.ToInt16(fileBytes(Index + 1))
loop ...
我可以得到如下的整数值:

Dim value As Int16 = BitConverter.ToInt16(fileBytes, Index + 8) / 2
但浮点数更复杂。只有较小的数字存储为两个字节。较大的值需要10个字节,但这是另一个问题。这里只有两个字节的较小值。下面是一些示例值。我将字节值输入Excel,并使用=DEC2BIN转换为二进制,根据需要在左侧添加零以获得8位

First   Second
Byte    Byte        Value   First   Byte    2nd     Byte

7       241     =   -1.2    0000    0111    1111    0001
254     255     =   -1      1111    1110    1111    1111
9       156     =   -0.8    0000    1001    1001    1100
9       181     =   -0.6    0000    1001    1011    0101
9       206     =   -0.4    0000    1001    1100    1110
9       231     =   -0.2    0000    1001    1110    0111
13      0       =   0       0000    1101    0000    0000
137     12      =   0.1     1000    1001    0000    1100
9       25      =   0.2     0000    1001    0001    1001
137     37      =   0.3     1000    1001    0010    0101
9       50      =   0.4     0000    1001    0011    0010
15      2       =   0.5     0000    1111    0000    0010
9       75      =   0.6     0000    1001    0100    1011
137     87      =   0.7     1000    1001    0101    0111
9       100     =   0.8     0000    1001    0110    0100
137     112     =   0.9     1000    1001    0111    0000
2       0       =   1       0000    0010    0000    0000
199     13      =   1.1     1100    0111    0000    1101
7       15      =   1.2     0000    0111    0000    1111
71      16      =   1.3     0100    0111    0001    0000
135     17      =   1.4     1000    0111    0001    0001
15      6       =   1.5     0000    1111    0000    0110
7       20      =   1.6     0000    0111    0001    0100
71      21      =   1.7     0100    0111    0001    0101
135     22      =   1.8     1000    0111    0001    0110
199     23      =   1.9     1100    0111    0001    0111
4       0       =   2       0000    0100    0000    0000
我希望有一个简单的转换方法。或者可能会更复杂

我看了一下:BCD在许多早期十进制计算机中使用,并在IBM System/360系列和


我不知道这是BCD还是什么。如何将这两位转换成浮点数

我使用了安德鲁·莫顿在评论中指出的信息。基本上,存储的16位数量由lsb为0时的15位2的补码整数或12位2的补码整数加上一个处理代码组成,该处理代码指示当lsb为1时应用于该整数的比例因子。我不熟悉vb.net,所以我在这里提供ISO-C代码。下面的程序成功地解码了问题中提供的所有数据

注意:我在下面的代码中转换为8字节的双精度格式,而问题表明原始转换可能是10字节长的双精度格式,即8087数学协处理器的80位扩展精度格式。尝试更多的测试数据以实现八个缩放代码的完全覆盖似乎是个好主意:大整数,如1000000和100000000;小数点,如0.0003、0.000005和0.00000007;和二元分数,如0.125 1/8和0.046875 3/64

包括 包括 包括 类型定义结构{ uint8字节1; uint8字节2; }num; num data[]= { { 7, 241}, {254, 255}, { 9, 156}, { 9, 181}, { 9, 206}, { 9, 231}, { 13, 0}, {137, 12}, { 9, 25}, {137, 37}, { 9, 50}, { 15, 2}, { 9, 75}, {137, 87}, { 9, 100}, {137, 112}, { 2, 0}, {199, 13}, { 7, 15}, { 71, 16}, {135, 17}, { 15, 6}, { 7, 20}, { 71, 21}, {135, 22}, {199, 23}, { 4, 0} }; int data_count=sizeof data/sizeof data[0]; /*定义vb.net程序员可能更熟悉的运算符*/ 定义异或^ 定义MOD% int主空隙 { int i; uint8_t b1、b2; uint16_t h,代码; int32_t n; 双r; 对于i=0;i
[  7,241]  n=ffffff10  r= -1.20000000
[254,255]  n=ffffffff  r= -1.00000000
[  9,156]  n=fffff9c0  r= -0.80000000
[  9,181]  n=fffffb50  r= -0.60000000
[  9,206]  n=fffffce0  r= -0.40000000
[  9,231]  n=fffffe70  r= -0.20000000
[ 13,  0]  n=00000000  r=  0.00000000
[137, 12]  n=000000c8  r=  0.10000000
[  9, 25]  n=00000190  r=  0.20000000
[137, 37]  n=00000258  r=  0.30000000
[  9, 50]  n=00000320  r=  0.40000000
[ 15,  2]  n=00000020  r=  0.50000000
[  9, 75]  n=000004b0  r=  0.60000000
[137, 87]  n=00000578  r=  0.70000000
[  9,100]  n=00000640  r=  0.80000000
[137,112]  n=00000708  r=  0.90000000
[  2,  0]  n=00000001  r=  1.00000000
[199, 13]  n=000000dc  r=  1.10000000
[  7, 15]  n=000000f0  r=  1.20000000
[ 71, 16]  n=00000104  r=  1.30000000
[135, 17]  n=00000118  r=  1.40000000
[ 15,  6]  n=00000060  r=  1.50000000
[  7, 20]  n=00000140  r=  1.60000000
[ 71, 21]  n=00000154  r=  1.70000000
[135, 22]  n=00000168  r=  1.80000000
[199, 23]  n=0000017c  r=  1.90000000
[  4,  0]  n=00000002  r=  2.00000000

我在评论中使用了安德鲁·莫顿指出的信息。基本上,存储的16位数量由lsb为0时的15位2的补码整数或12位2的补码整数加上一个处理代码组成,该处理代码指示当lsb为1时应用于该整数的比例因子。我不熟悉vb.net,所以我在这里提供ISO-C代码。下面的程序成功地解码了问题中提供的所有数据

注意:我在下面的代码中转换为8字节的双精度格式,而问题表明原始转换可能是10字节长的双精度格式,即8087数学协处理器的80位扩展精度格式。尝试更多的测试数据以实现八个缩放代码的完全覆盖似乎是个好主意:大整数,如1000000和100000000;小数点,如0.0003、0.000005和0.00000007;和二元分数,比如0.125 1/8和0.04 6875 3/64

包括 包括 包括 类型定义结构{ uint8字节1; uint8字节2; }num; num data[]= { { 7, 241}, {254, 255}, { 9, 156}, { 9, 181}, { 9, 206}, { 9, 231}, { 13, 0}, {137, 12}, { 9, 25}, {137, 37}, { 9, 50}, { 15, 2}, { 9, 75}, {137, 87}, { 9, 100}, {137, 112}, { 2, 0}, {199, 13}, { 7, 15}, { 71, 16}, {135, 17}, { 15, 6}, { 7, 20}, { 71, 21}, {135, 22}, {199, 23}, { 4, 0} }; int data_count=sizeof data/sizeof data[0]; /*定义vb.net程序员可能更熟悉的运算符*/ 定义异或^ 定义MOD% int主空隙 { int i; uint8_t b1、b2; uint16_t h,代码; int32_t n; 双r; 对于i=0;i
[  7,241]  n=ffffff10  r= -1.20000000
[254,255]  n=ffffffff  r= -1.00000000
[  9,156]  n=fffff9c0  r= -0.80000000
[  9,181]  n=fffffb50  r= -0.60000000
[  9,206]  n=fffffce0  r= -0.40000000
[  9,231]  n=fffffe70  r= -0.20000000
[ 13,  0]  n=00000000  r=  0.00000000
[137, 12]  n=000000c8  r=  0.10000000
[  9, 25]  n=00000190  r=  0.20000000
[137, 37]  n=00000258  r=  0.30000000
[  9, 50]  n=00000320  r=  0.40000000
[ 15,  2]  n=00000020  r=  0.50000000
[  9, 75]  n=000004b0  r=  0.60000000
[137, 87]  n=00000578  r=  0.70000000
[  9,100]  n=00000640  r=  0.80000000
[137,112]  n=00000708  r=  0.90000000
[  2,  0]  n=00000001  r=  1.00000000
[199, 13]  n=000000dc  r=  1.10000000
[  7, 15]  n=000000f0  r=  1.20000000
[ 71, 16]  n=00000104  r=  1.30000000
[135, 17]  n=00000118  r=  1.40000000
[ 15,  6]  n=00000060  r=  1.50000000
[  7, 20]  n=00000140  r=  1.60000000
[ 71, 21]  n=00000154  r=  1.70000000
[135, 22]  n=00000168  r=  1.80000000
[199, 23]  n=0000017c  r=  1.90000000
[  4,  0]  n=00000002  r=  2.00000000
只是一个VB.Net翻译的C代码。 原始结构已替换为字节数组和适应.Net类型的数字数据类型。就这些

Dim data As Byte(,) = New Byte(,) {
    {7, 241}, {254, 255}, {9, 156}, {9, 181}, {9, 206}, {9, 231}, {13, 0}, {137, 12}, {9, 25}, 
    {137, 37}, {9, 50}, {15, 2}, {9, 75}, {137, 87}, {9, 100}, {137, 112}, {2, 0}, {199, 13}, 
    {7, 15}, {71, 16}, {135, 17}, {15, 6}, {7, 20}, {71, 21}, {135, 22}, {199, 23}, {4, 0}
}

Dim byte1, byte2 As Byte
Dim word, code As UShort
Dim nValue As Integer
Dim result As Double

For i As Integer = 0 To (data.Length \ 2 - 1)
    byte1 = data(i, 0)
    byte2 = data(i, 1)
    word = (byte2 * 256US) + byte1
    If (word Mod 2) = 1 Then
        code = (word \ 2US) Mod 8US
        nValue = ((word \ 16) Xor 2048) - 2048
        Select Case code
            Case 0 : result = nValue * 5000
            Case 1 : result = nValue * 500
            Case 2 : result = nValue / 20
            Case 3 : result = nValue / 200
            Case 4 : result = nValue / 2000
            Case 5 : result = nValue / 20000
            Case 6 : result = nValue / 16
            Case 7 : result = nValue / 64
        End Select
    Else
        'unscaled 15-bit integer in h<15:1>. Extract, sign extend to 32 bits
        nValue = ((word \ 2) Xor 16384) - 16384
        result = nValue
    End If
    Console.WriteLine($"[{byte1,3:D}, {byte2,3:D}]  number = {nValue:X8} result ={result,12:F8}")
Next
只是一个VB.Net翻译的C代码。 原始结构已替换为字节数组和适应.Net类型的数字数据类型。就这些

Dim data As Byte(,) = New Byte(,) {
    {7, 241}, {254, 255}, {9, 156}, {9, 181}, {9, 206}, {9, 231}, {13, 0}, {137, 12}, {9, 25}, 
    {137, 37}, {9, 50}, {15, 2}, {9, 75}, {137, 87}, {9, 100}, {137, 112}, {2, 0}, {199, 13}, 
    {7, 15}, {71, 16}, {135, 17}, {15, 6}, {7, 20}, {71, 21}, {135, 22}, {199, 23}, {4, 0}
}

Dim byte1, byte2 As Byte
Dim word, code As UShort
Dim nValue As Integer
Dim result As Double

For i As Integer = 0 To (data.Length \ 2 - 1)
    byte1 = data(i, 0)
    byte2 = data(i, 1)
    word = (byte2 * 256US) + byte1
    If (word Mod 2) = 1 Then
        code = (word \ 2US) Mod 8US
        nValue = ((word \ 16) Xor 2048) - 2048
        Select Case code
            Case 0 : result = nValue * 5000
            Case 1 : result = nValue * 500
            Case 2 : result = nValue / 20
            Case 3 : result = nValue / 200
            Case 4 : result = nValue / 2000
            Case 5 : result = nValue / 20000
            Case 6 : result = nValue / 16
            Case 7 : result = nValue / 64
        End Select
    Else
        'unscaled 15-bit integer in h<15:1>. Extract, sign extend to 32 bits
        nValue = ((word \ 2) Xor 16384) - 16384
        result = nValue
    End If
    Console.WriteLine($"[{byte1,3:D}, {byte2,3:D}]  number = {nValue:X8} result ={result,12:F8}")
Next

Lotus 123 for DOS最初由Jonathan Sachs使用英特尔8088汇编语言为IBM PC编写。Wikipedia说,第2版支持x87数学协处理器,它还说第3版和第4版主要是用CIf.wk4文件编写的。关于该格式的一些信息,请参阅。或者您可能想查看的源代码,看看它们是如何读取.wk4文件的。@AndrewMorton-Beautiful,看起来很有前途。我星期一去看看。谢谢。@D_Bester我在解码整数时遇到了麻烦。要么是网站上对格式的描述有误,要么是我在翻译代码时出错了。你能给你的测试数据再加一些整数吗:3.0,4.0,5.0,15.0,16.0,17.0,32.0?Lotus 123 for DOS最初是由Jonathan Sachs用英特尔8088汇编语言为IBM PC编写的。Wikipedia说第2版支持x87数学协处理器,它还说第3版和第4版主要是用CIf.wk4文件编写的。关于该格式的一些信息,请参阅。或者您可能想查看的源代码,看看它们是如何读取.wk4文件的。@AndrewMorton-Beautiful,看起来很有前途。我星期一去看看。谢谢。@D_Bester我在解码整数时遇到了麻烦。要么是网站上对格式的描述有误,要么是我在翻译代码时出错了。你能给你的测试数据再加一些整数吗:3.0,4.0,5.0,15.0,16.0,17.0,32.0?哇,太棒了!非常感谢你!哇,太棒了!非常感谢你!非常感谢你!我非常感谢VB.net的翻译!效果很好。是的,我很高兴它很有帮助,但你真的需要选择@njuffa答案作为好答案。这只是一个翻译。我不能把这归功于你。非常感谢你!我非常感谢VB.net的翻译!效果很好。是的,我很高兴它很有帮助,但你真的需要选择@njuffa答案作为好答案。这只是一个翻译。我不能把这归功于我。