JS幻想 讀取二進(jìn)制文件
更新時(shí)間:2009年04月20日 15:25:34 作者:
如果說讓JavaScript讀取站點(diǎn)上一文本文件,那不過是個(gè)再簡單不了的事了;但若說要換成一個(gè)二進(jìn)制的文件,并且是完全靜態(tài)的讀取,那似乎有點(diǎn)天方夜譚了。
編碼程序雖不復(fù)雜,不過也不是幾句就能搞定的,為方面這里給個(gè)ASP版本的(運(yùn)行效率非常低,不過處理小文件還是很快的)。JavaScript的解碼程序倒是非常的簡短,放在Demo.html里一起貼出了。
JSBin.asp:
復(fù)制代碼 代碼如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%Option Explicit%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JSBin</title>
</head>
<body>
<%
'==================================================
' 類: Stream
'==================================================
Const adTypeBinary = 1
Const adLongVarBinary = 205
Const adSaveCreateOverWrite = 2
Class Stream
Dim bytBuffer
Dim lngSize
Dim lngOffset
'==================================================
' 方法: Load
' 說明: 從文件載入數(shù)據(jù)流
'==================================================
Public Function Load(Path)
Dim objADOStream
Dim binData
Dim i
Set objADOStream = Server.CreateObject("ADODB.Stream")
With objADOStream
.Type = adTypeBinary
.Open
End With
With objADOStream
.LoadFromFile Path
binData = .Read
.Close
End With
Set objADOStream = Nothing
lngSize = Ubound(binData)
ReDim bytBuffer(lngSize)
lngOffset = 0
'
' 讀取數(shù)據(jù)
'
For i = 0 To lngSize
bytBuffer(i) = AscB(MidB(binData, i + 1, 1))
Next
lngSize = lngSize + 1
End Function
'==================================================
' 方法: Save
'==================================================
Public Function Save(Path)
Dim objADOStream
Dim objRS
Dim i
Dim binData
Set objADOStream = Server.CreateObject("ADODB.Stream")
Set objRS = Server.CreateObject("ADODB.Recordset")
'
' ASP處理二進(jìn)制只能如此
'
For i = 0 To lngSize - 1
binData = binData & ChrB(bytBuffer(i))
Next
With objRS
.Fields.Append "t", adLongVarBinary, lngSize
.Open
.AddNew
.Fields("t").AppendChunk binData
.Update
binData = .Fields("t").GetChunk(lngSize)
End With
With objADOStream
.Type = adTypeBinary
.Open
.Write binData
.SaveToFile Path, adSaveCreateOverWrite
.Close
End With
Set objADOStream = Nothing
Set objRS = Nothing
End Function
'==================================================
' 方法: Seek
' 說明: 定位字節(jié)流當(dāng)前位置
'==================================================
Public Function Seek(pos)
lngOffset = pos
End Function
'==================================================
' 方法: Read
'==================================================
Public Function ReadByte()
ReadByte = bytBuffer(lngOffset)
lngOffset = lngOffset + 1
End Function
'==================================================
' 方法: WriteUInt
'==================================================
Public Function WriteUInt(Code)
bytBuffer(lngOffset) = CByte(Code Mod 256)
bytBuffer(lngOffset + 1) = CByte(Code \ 256)
lngOffset = lngOffset + 2
End Function
'==================================================
' 屬性: Size
'==================================================
Public Property Get Size()
Size = lngSize
End Property
Public Property Let Size(value)
lngSize = value
ReDim Preserve bytBuffer(lngSize - 1)
End Property
End Class
'==================================================
' 類: Vector
'==================================================
Const DEFAULT_SIZE = 20
Const NUM_INC = 50
Class Vector
Dim arrContainer()
Dim lngSize
Dim lngCount
'==================================================
' 過程: 類構(gòu)造
'==================================================
Private Sub Class_Initialize()
lngCount = 0
lngSize = DEFAULT_SIZE
ReDim arrContainer(DEFAULT_SIZE - 1)
End Sub
Private Sub Class_Terminate()
End Sub
'==================================================
' 屬性: Add
'==================================================
Public Function Add(value)
If lngCount = lngSize Then
lngSize = lngSize + NUM_INC
ReDim Preserve arrContainer(lngSize)
End If
arrContainer(lngCount) = value
lngCount = lngCount + 1
End Function
'==================================================
' 屬性: Item
'==================================================
Public Property Get Item(id)
Item = arrContainer(id)
End Property
'==================================================
' 屬性: Count
'==================================================
Public Property Get Count()
Count = lngCount
End Property
End Class
'==================================================
' 函數(shù): JSBin
' 說明: 將制定的文件轉(zhuǎn)換為JS兼容的二進(jìn)制文件
' EtherDream 08/06/10
'==================================================
Function JSBin(FileIn, FileOut)
Const USHRT_MAX = 65536
Dim objStream
Dim lngFileLen
Dim lngSize
Dim intBuffer()
Dim Table(65535)
Dim intVal
Dim vctKey
Dim vctZero
Dim intKeyNum
Dim intKeyVal
Dim i
'
' 建立腳本字節(jié)流對象
'
Set objStream = New Stream
Set vctKey = New Vector
Set vctZero = New Vector
'
' 載入文件
'
objStream.Load FileIn
lngFileLen = objStream.Size
lngSize = (lngFileLen - 1) \ 2
'
' 將字節(jié)流轉(zhuǎn)換為整型數(shù)組
'
ReDim intBuffer(lngSize)
On Error Resume Next
With objStream
For i = 0 To lngSize
intVal = .ReadByte()
intVal = intVal + .ReadByte() * 256
intBuffer(i) = intVal
Next
End With
On Error Goto 0
'
' 計(jì)數(shù)器清零
'
Table(0) = USHRT_MAX
For i = 1 To USHRT_MAX - 1
Table(i) = 0
Next
'
' 統(tǒng)計(jì)每個(gè)Unicode字符出現(xiàn)的次數(shù)(\0\0除外)
'
With vctZero
For i = 0 To lngSize
intVal = intBuffer(i)
If intVal = 0 Then
.Add i
Else
Table(intVal) = Table(intVal) + 1
End If
Next
End With
'
' 尋找出現(xiàn)次數(shù)最少的Unicode
'
intKeyNum = USHRT_MAX
For i = 0 To USHRT_MAX - 1
intVal = Table(i)
If intVal < intKeyNum Then
intKeyNum = intVal
intKeyVal = i
End If
'
' 發(fā)現(xiàn)從未出現(xiàn)過的字符直接完成
'
If intKeyNum = 0 Then
Exit For
End If
Next
'
' 尋找并記錄整型數(shù)組中所有intKeyVal的位置
'
If intKeyNum > 0 Then
With vctKey
For i = 0 To lngSize
If intBuffer(i) = intKeyVal Then
.Add i
End If
Next
End With
End If
'
' 將整型數(shù)組中的0替換為intKeyVal
'
With vctZero
For i = 0 To .Count - 1
intBuffer(.Item(i)) = intKeyVal
Next
End With
Dim pos
'
' 生成目標(biāo)文件
'
With objStream
.Size = 6 + intKeyNum * 4 + (lngSize + 1) * 2
.Seek 0
.WriteUInt 65279 'Unicode文件頭 0xFEFF
.WriteUInt intKeyVal '出現(xiàn)最少的Unicode值 (0已排除)
.WriteUInt intKeyNum + 1 '出現(xiàn)最少的Unicode次數(shù) (避免0)
For i = 0 To intKeyNum - 1 '記錄每個(gè)最少值的出現(xiàn)位置
pos = vctKey.Item(i)
.WriteUInt (pos MOD 65535) + 1 '(避免0)
.WriteUInt (pos \ 65535) + 1 '(避免0)
Next
For i = 0 To lngSize
.WriteUInt intBuffer(i)
Next
'
' 保存數(shù)據(jù)至文件
'
.Save FileOut
Response.Write "轉(zhuǎn)換完成!<br>保存至 " & FileOut & "<br>源文件: " & lngFileLen & "字節(jié).<br>轉(zhuǎn)換后: " & .Size & "字節(jié)."
End With
Set objStream = Nothing
Set vctZero = Nothing
Set vctKey = Nothing
End Function
Sub Main()
Dim strFile
Dim strFileIn
Dim strFileOut
strFile = Request.QueryString("path")
strFileIn = Server.MapPath(strFile)
strFileOut = Server.MapPath(strFile & ".txt")
JSBin strFileIn, strFileOut
End Sub
Main
%>
</body>
</html>
使用時(shí)加上path參數(shù)即可對指定的文件編碼,比如JSBin.asp?path=123.rar,就會(huì)對123.rar編碼,并生成123.rar.txt的文件.
客戶端的可以在我的空間上預(yù)覽:
http://www.etherdream.com/FunnyScript/JSBin/JSBinDemo.html
可以在里面輸入 JSBin.rar.txt,123.jpg.txt,jsmin.exe.txt即對相應(yīng)的編碼文件加載,所顯示的內(nèi)容與編碼前的文件一模一樣.對一個(gè)二進(jìn)制的文件僅僅做了幾個(gè)字節(jié)的修改,就能讓JavaScript讀取,不是很有趣嗎?
相關(guān)文章
javascript讀取xml實(shí)現(xiàn)javascript分頁
這篇文章主要介紹了javascript讀取xml數(shù)據(jù)對其實(shí)現(xiàn)javascript分頁效果,大家參考使用吧2013-12-12layer.msg()去掉默認(rèn)時(shí)間,實(shí)現(xiàn)手動(dòng)關(guān)閉的方法
今天小編就為大家分享一篇layer.msg()去掉默認(rèn)時(shí)間,實(shí)現(xiàn)手動(dòng)關(guān)閉的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09TypeScript中的類型斷言[as語法|<>語法]的使用
本文主要介紹了TypeScript中的類型斷言[as語法|<>語法]的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06在 webpack 中使用 ECharts的實(shí)例詳解
這篇文章主要介紹了在 webpack 中使用 ECharts的實(shí)例代碼,需要的朋友可以參考下2018-02-02javascript tips提示框組件實(shí)現(xiàn)代碼
一個(gè)簡單的類似title的提示效果,但現(xiàn)實(shí)內(nèi)容可以很豐富,以上js另存為tip.js,下面是使用的demo。2010-11-11深入理解JavaScript中async/await的錯(cuò)誤處理方式
在現(xiàn)代JavaScript開發(fā)中,異步編程是不可或缺的一部分,async和await是一種強(qiáng)大的異步編程工具,它們使得編寫和維護(hù)異步代碼更加容易和清晰,然而,異步操作仍然可能會(huì)出現(xiàn)錯(cuò)誤,本文將深入探討async和await的錯(cuò)誤處理方式,提供詳細(xì)的代碼示例和解釋2023-09-09