Windowsの「バイナリ」を読むことでASP jscript変数にフローチします
-
23-10-2019 - |
質問
バイナリ - つまり、8バイトのパック配列として実数(8バイトの「ダブル」タイプ)を保存するレガシーWindowsアプリによって作成されたファイルを読み取る必要があります。 8バイトグループOKを読むことができますが、どうすればASP JScriptコードに提示することができますか?
またはそれを別の言い方をするために:
ファイルは、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形式の実数です。 ASPでこれらの8バイトを読むことができると仮定すると、実際の数を再び戻す簡単な方法はありますか?
解決
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/eee-754/)
他のヒント
あなたの助けをありがとうOrenに感謝します。バベージのものは特に便利でした。ここで私が書かなければならなかったコード(規範以外については徹底的にテストされていない)の価値があるため:
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) ;
}
}
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
所属していません StackOverflow