2010-06-02 20 views
1

Je dois lire les fichiers produits par une application Windows héritée qui stocke des nombres réels (le type «double» de 8 octets) en binaire - c'est-à-dire un tableau de 8 octets. Je peux lire le groupe de 8 octets OK, mais comment puis-je le présenter à mon code ASP JScript de telle sorte que je puisse récupérer le vrai nombre.Lecture d'un flottant «binaire» Windows dans une variable ASP jscript

Ou pour le dire autrement:

Dites un fichier a été produit par un programme Windows (Delphi):

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

Inspection du fichier montrera qu'il contient 8 octets, soit:

94 0E 4C CA C2 97 AD 53 

qui est le nombre réel au format IEEE. En supposant que je puisse lire ces 8 octets de retour dans ASP, y a-t-il un moyen simple de récupérer le nombre réel?

+0

Je cherchais la réponse à cela depuis un certain temps moi-même. Je veux être capable de le faire entièrement dans asp-classic dans JScript ou VBScript, chaque fois que je me tourne, il me semble que j'ai besoin de recourir à un langage de programmation plus élevé (par exemple C++, C#, ...). –

Répondre

1

Regardez BitConverter.ToDouble().

Dans une page ASP.NET, cela pourrait ressembler à:

<%@ 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); 
%> 

Ce qui vous obtient la sortie:

1.2345678E+95 

(Vous pouvez vérifier l'exactitude à http://babbage.cs.qc.edu/IEEE-754/)

+0

semble parfait, mais est-ce que JScript doit" Double "... ne semble pas à ... – rossmcm

+0

Il semble y avoir une foule de choses dans cs pour accéder à et à partir de divers formats de nombres, mais toutes les sources que je peux trouver sur Google Code sont juste des wrappers pour les routines de bibliothèque. Honte, quand le format des nombres dans JScript est presque certainement le même que celui avec lequel je commence, s'il y a une façon de "typer" mon tableau de huit octets au-dessus de la double variable (je suppose , 'cos les tableaux JScript ne sont pas de vrais tableaux de toute façon)? – rossmcm

+0

Hmm, je n'avais pas réalisé que vous aviez besoin de code JScript J'ai modifié la réponse au JScript côté serveur Si vous avez besoin de javascript côté client, le .NET BCL ne sera pas être disponible, vous devrez alors analyser le IEEE 754 fl nombre de points de précision à double précision de ses bits. Voir http://steve.hollasch.net/cgindex/coding/ieeefloat.html. –

0

Vous pouvez utiliser un flux ADO. Il est utilisé pour lire, écrire et gérer un flux de données binaires ou de texte.

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

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

Vous aurez besoin de la fonction suivante si:

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

Je peux déjà faire ce bit (obtenir les 8 octets). Ce que je veux faire est de l'obtenir comme un vrai, c'est-à-dire que je veux être capable d'écrire "Response.Write (RealNumber) et de voir le nombre réel affiché – rossmcm

1

Merci Oren pour votre aide. Le truc de babbage était particulièrement utile. Pour ce que cela vaut le code que je devais écrire (pas entièrement testé pour autre chose que des normes):

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) ; 
    }  
} 
+0

+1. Analyse de virgule flottante binaire en javascript - soigné! –