2010-06-02 81 views
1

我需要讀取由舊式Windows應用程序生成的文件,該應用程序以二進制形式存儲實數(8字節「double」類型) - 即作爲8的打包數組字節。我可以讀取8字節組OK,但是如何將它呈現給我的ASP JScript代碼,以便我可以再次獲取實數。將Windows'二進制'浮點數讀取到ASP jscript變量中

,或者換一種說法:

說一個文件是由Windows(德爾福)計劃生產:

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格式的實數。假設我可以用ASP讀取這8個字節,有沒有簡單的方法讓真實數字再次回來?

+0

我一直在尋找自己的答案。我希望能夠完全用JScript或VBScript中的asp-classic完成它,每轉一步,似乎我都需要藉助更高級的編程語言(例如C++,C#,...)。 – 2012-01-28 00:25:51

回答

1

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/檢查正確性)

+0

看起來很完美,但沒有JScript有toDouble ...似乎沒有to ... – rossmcm 2010-06-02 09:03:17

+0

在cs中似乎有很多東西可以來自各種數字格式,但是我可以在Google Code上找到的所有源代碼都只是庫例程的包裝器。我想我正在考慮切割一些JS做了大量的算術操作,遺憾的是,當JScript中的數字格式幾乎可以肯定地與我開始的數字格式相同時,如果有任何方式「在我的八字節數組上重複」變形「(我猜不是,'cos JScript數組不是真正的數組)? – rossmcm 2010-06-02 10:31:45

+0

嗯,沒有意識到你需要JScript代碼。我修改了服務器端JScript的答案。如果你需要客戶端JavaScript,.NET BCL將不會可用;您將需要解析IEEE 754 fl從它的比特中選擇雙精度數字。請參閱http://steve.hollasch.net/cgindex/coding/ieeefloat.html。 – 2010-06-02 14:41:39

0

您可以使用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

我已經可以做到這一點(獲得8字節)。我想要做的是把它作爲一個真正的,即我想能夠寫「Response.Write(RealNumber),並看到顯示的實際數字。 – rossmcm 2010-06-02 06:49:25

1

謝謝奧倫爲你提供幫助。 babbage的東西特別有用。對於這裏值得我寫的代碼(除了規範以外沒有完全測試過):

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。在javascript中解析二進制浮點 - 整潔! – 2010-06-09 00:00:07

相關問題