欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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í)現(xiàn)javascript分頁

    這篇文章主要介紹了javascript讀取xml數(shù)據(jù)對其實(shí)現(xiàn)javascript分頁效果,大家參考使用吧
    2013-12-12
  • layer.msg()去掉默認(rèn)時(shí)間,實(shí)現(xiàn)手動(dòng)關(guān)閉的方法

    layer.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-09
  • TypeScript中的類型斷言[as語法|<>語法]的使用

    TypeScript中的類型斷言[as語法|<>語法]的使用

    本文主要介紹了TypeScript中的類型斷言[as語法|<>語法]的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 在 webpack 中使用 ECharts的實(shí)例詳解

    在 webpack 中使用 ECharts的實(shí)例詳解

    這篇文章主要介紹了在 webpack 中使用 ECharts的實(shí)例代碼,需要的朋友可以參考下
    2018-02-02
  • three.js 將圖片馬賽克化的示例代碼

    three.js 將圖片馬賽克化的示例代碼

    這篇文章主要介紹了three.js 將圖片馬賽克化的方法,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • javascript tips提示框組件實(shí)現(xiàn)代碼

    javascript tips提示框組件實(shí)現(xiàn)代碼

    一個(gè)簡單的類似title的提示效果,但現(xiàn)實(shí)內(nèi)容可以很豐富,以上js另存為tip.js,下面是使用的demo。
    2010-11-11
  • 常用javascript表單驗(yàn)證匯總

    常用javascript表單驗(yàn)證匯總

    這篇文章主要介紹了一些常用javascript表單驗(yàn)證,文章最后還附帶了一個(gè)實(shí)踐案例,以驗(yàn)證數(shù)字為例進(jìn)行講解,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 原生JS實(shí)現(xiàn)的雙色球功能示例

    原生JS實(shí)現(xiàn)的雙色球功能示例

    這篇文章主要介紹了原生JS實(shí)現(xiàn)的雙色球功能,涉及javascript隨機(jī)數(shù)生成及數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • 微信小程序利用Canvas繪制圖片和豎排文字詳解

    微信小程序利用Canvas繪制圖片和豎排文字詳解

    這篇文章主要介紹了微信小程序利用Canvas繪制圖片和豎排文字詳解,合成圖片應(yīng)該按照 Canvas 的文檔來做都沒什么問題,主要是有個(gè)豎排文字的需求,這里和大家分享一下,需要的朋友可以參考下
    2019-06-06
  • 深入理解JavaScript中async/await的錯(cuò)誤處理方式

    深入理解JavaScript中async/await的錯(cuò)誤處理方式

    在現(xiàn)代JavaScript開發(fā)中,異步編程是不可或缺的一部分,async和await是一種強(qiáng)大的異步編程工具,它們使得編寫和維護(hù)異步代碼更加容易和清晰,然而,異步操作仍然可能會(huì)出現(xiàn)錯(cuò)誤,本文將深入探討async和await的錯(cuò)誤處理方式,提供詳細(xì)的代碼示例和解釋
    2023-09-09

最新評論