Чтение 'двоичного' плавания Windows в ASP jscript переменная

Я должен считать файлы, произведенные Приложением Windows прежней версии, которое хранит вещественные числа (8-байтовый "двойной" тип) в двоичном файле - т.е. как упакованный массив 8 байтов. Я могу считать 8-байтовую группу хорошо, но как я могу представить ее своему JScript ASP, кодируют такой, я могу вернуть вещественное число снова.

Или помещать его иначе:

Скажите, что файл был произведен Windows (Delphi) программа:

Assign (f, 'test.bin') ;
rewrite (f, 1) ;
r := 1234.56E78 ;
BlockWrite (f, r, SizeOf (Double)) ;
Close (f) ;

Контроль файла покажет, что содержит 8 байтов, будучи:

94 0E 4C CA C2 97 AD 53

который является вещественным числом в формате IEEE. Принятие я могу считать эти 8 байтов назад в ASP, там простой способ вернуть вещественное число снова?

1
задан Joel Coehoorn 30 November 2011 в 05:55
поделиться

3 ответа

Посмотрите на BitConverter.ToDouble () .

На странице ASP.NET это может выглядеть так:

<%@ Page Language="JScript"
    AutoEventWireup="true"
    CodeBehind="Default.aspx.cs"
    Inherits="WebApplication1._Default" %>
<%
    var bytes: byte[] = [0x94, 0x0e, 0x4c, 0xca, 0xc2, 0x97, 0xad, 0x53];
    var d = BitConverter.ToDouble(bytes, 0);
    Response.Write(d);
%>

Что дает вам результат:

1.2345678E+95

(Вы можете проверить правильность на http://babbage.cs.qc.edu/IEEE -754 / )

1
ответ дан 3 September 2019 в 00:07
поделиться

Вы можете использовать поток ADO. Он используется для чтения, записи и управления потоком двоичных данных или текста.

Dim objStream As ADODB.Stream
objStream.Type = 1
objStream.LoadFromFile path

Dim Number : Number = BytesToNumEx(objStream.Read 8, 1, 8, False)

Вам понадобится следующая функция:

Function BytesToNumEx(ByteArray(), StartRec, EndRec, UnSigned) 
    Dim i
    Dim lng256 : lng256 = 1
    Dim lngReturn : lngReturn = 0

    If EndRec < 1 Then
        EndRec = UBound(ByteArray)
    End If

    If StartRec > EndRec Or StartRec < 0 Then
        BytesToNumEx = -1
        Exit Function
    End If

    lngReturn = lngReturn + (ByteArray(StartRec))
    For i = (StartRec + 1) To EndRec
        lng256 = lng256 * 256
        If i < EndRec Then
            lngReturn = lngReturn + (ByteArray(i) * lng256)
        Else
            If ByteArray(i) > 127 And UnSigned = False Then
             lngReturn = (lngReturn + ((ByteArray(i) - 256) * lng256))
            Else
                lngReturn = lngReturn + (ByteArray(i) * lng256)
            End If
        End If
    Next 

    BytesToNumEx = lngReturn
End Function
0
ответ дан 3 September 2019 в 00:07
поделиться

Спасибо, Орен, за помощь. Бэббидж был особенно полезен. Для чего здесь нужен код, который мне пришлось написать (тщательно не проверенный ни на что иное, кроме норм):

function ReadFileDouble (Stream)
{ 
var Bytes0To3 = ReadFileLongword (Stream) ;
var Bytes4To5 = ReadFileWord (Stream) ;
var Bytes6To7 = ReadFileWord (Stream) ;

var Mantissa = Bytes0To3 + (Bytes4To5 * 65536 * 65536) + ((Bytes6To7 & 0x0F) * 65536 * 65536 * 65536) ;
var Fraction = Mantissa / 0x0010000000000000 ;
var Exponent = ((Bytes6To7 >>> 4) & 0x07FF) ;
var SignBit  = ((Bytes6To7 & 0x8000) != 0) ;
if (SignBit)
    {
    Sign = -1 ;
    }
else
    {
    Sign = +1 ;
    }    

var Bias     = 1023 ;

if (Exponent == 0)
    {
    if (Mantissa == 0)
        {
        return (0.00 * Sign) ;
        }
    else
        {
        return ((Fraction * (Math.pow (2.0, - Bias + 1))) * Sign) ;
        }        
    }
else if (Exponent == 1023)
    {
    if (Mantissa == 0)
        {
        return (Number.POSITIVE_INFINITY * Sign) ;
        }
    else if (Mantissa < 0x0008000000000000)
        {
        return (Number.NaN * Sign) ;
        }
    else
        {
        return (Number.NaN * Sign) ;
        }        
    }    
else 
    {
    return ((1.0 + Fraction) * (Math.pow (2.0, Exponent - Bias)) * Sign) ;
    }    
}
1
ответ дан 3 September 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: