2015年1月8日木曜日

あけおめです。(Base64)

あけましておめでとうございます。

さて、本年も年初めとしてネタはーーーーとくにありません。



とまぁ、それだとあれなので、久しぶりにプログラムコードでも投稿です。

VB Scriptという奴で、下記のコードを全丸丸コピーし、メモ帳に貼り付けます。

貼りつけたテキストを保存し、拡張子を「.txt」から「.vbs」に変更。ただそれだけです。


何ができるかと言えば、ZIPファイルをドロップアンドドラッグするとテキストデータに変換された「.txt」ファイルを作る。
ただそれだけです。

変換した「.txt」ファイルと再びドロップアンドドラッグすると「.zip」ファイルを作成する。

とまぁ、ただそれだけの話ですね。

ZIPファイルをHTMLページに組み込んだりするのに使用しようかなと、作ったデータもの。

画像なんかは
<img alt="" src="data:image/jpeg;base64,生成したコード" />
みたいな感じで埋め込めるので、ZIPも出来ないのかなぁ? と思って作った産物です。

 埋め込みの方法は

data:[<MIME-type>][;charset=<encoding>][;base64],<data>
で、MIME-typeは「application」を指定し、charsetには「zip」と記載してやればいけそうです。

zipアーカイブ

需要はどれだけあるか不明ですが、当ブログのようなケースだと、この方法使えば別にファイルをアップロードしてリンクを張らなくて済むという利点があるので、助かると言えば助かりますね。
ただまぁ、ファイル名がファイル名なので、これが今後の課題かなぁ。

Option Explicit

Dim objParm


'①コマンドライン引数の情報を保存
Set objParm = Wscript.Arguments

'②取得したコマンドライン引数が2つ未満のときはエラー
If objParm.Count = 0 Then
WScript.echo "コマンドライン引数が足りません"
WScript.Quit
end if

Dim strMessage

For Each strMessage in objParm
WScript.echo strMessage & "を処理します。"
SetPath(strMessage)
next
WScript.Quit


'データ処理
Sub SetPath(Value)
Dim pos , root, filename , exi,rec , filepath
rec = -1
pos = InStrRev(Value, "\")
root = Left(Value, pos)
filename = Mid(Value, pos + 1)
pos = InStrRev(filename, ".")
exi = Mid(filename, pos + 1)
filename = Left(filename, pos - 1)
if exi = "zip" then
pos = EncodeBase64(Value)
filepath = root & filename & ".txt"
rec = PrintText(pos, filepath)
WScript.echo "エンコード処理を実施します"
elseif exi="txt" then
pos = ReadText(Value)
filepath = root & filename & ".zip"
rec = DecodeBase64(pos, filepath)
WScript.echo "デコード処理を実施します"
end if
if rec = -1 then
WScript.echo "失敗しました。"
else
WScript.echo "成功しました。"
end if
End Sub

'ファイルをBase64エンコード
Function EncodeBase64(filepath )
Dim elm
Dim ret
Const adTypeBinary = 1
Const adReadAll = -1
ret = "" '初期化
On Error Resume Next
Set elm = CreateObject("MSXML2.DOMDocument").createElement("base64")
With CreateObject("ADODB.Stream")
.Type = adTypeBinary
.Open
.LoadFromFile filepath
elm.DataType = "bin.base64"
elm.nodeTypedValue = .Read(adReadAll)
ret = elm.Text
.Close
End With
On Error GoTo 0
EncodeBase64 = ret
End Function

'ファイルをBase64デコード
Function DecodeBase64( Base64Str , filepath )
Dim elm
Dim ret
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
ret = -1 '初期化
On Error Resume Next
Set elm = CreateObject("MSXML2.DOMDocument").createElement("base64")
elm.DataType = "bin.base64"
elm.Text = Base64Str
With CreateObject("ADODB.Stream")
.Type = adTypeBinary
.Open
.Write elm.nodeTypedValue
.SaveToFile filepath, adSaveCreateOverWrite
.Close
End With
If Err.Number <> 0 Then ret = 0
On Error GoTo 0
DecodeBase64 = ret
End Function

'テキスト出力
Function PrintText(Value ,filepath)
dim objFileSys
dim strScriptPath
dim objWriteStream
on error resume next
err.clear

Set objFileSys = CreateObject("Scripting.FileSystemObject")
objFileSys.CreateTextFile filepath

Set objWriteStream = objFileSys.OpenTextFile(filepath,2,True)

objWriteStream.Write Value
objWriteStream.Close


Set objWriteStream = nothing
Set objFileSys = Nothing

if err.Number <> 0 then
PrintText = -1
else
PrintText = 1
end if
End Function

'テキスト入力
Function ReadText(filepath)
dim objFileSys
dim objTextStream
dim strText

Set objFileSys = Createobject("Scripting.FileSystemObject")

Set objTextStream = objFileSys.OpenTextFile(filepath,1)

if objTextStream.AtEndOfStream = False then
strText = objTextStream.ReadAll
end if

objTextStream.Close

Set objTextStream = nothing
Set objFileSys = Nothing

ReadText = strText

End Function

2 件のコメント:

  1. 本年もよろしくお願いします。

    返信削除
    返信
    1. 名古屋鶏様
      こちらこそよろしくお願いいたします。

      削除