1

バイナリファイルを読み取ってデータを編集してから、ファイルを新しいファイルとして書き戻そうとしています。ファイルの読み取りと書き込みは問題ありません...正常に動作します。

しかし、バイナリデータを変更しようとすると、「VBScriptランタイムエラー:タイプの不一致」というエラーが発生します。

例として、ファイルを読み取り、3番目のバイトを「@」(アットマーク)に変更しています。

Option Explicit

Const ADTYPEBINARY = 1
Const ADSAVECREATEOVERWRITE = 2

Dim gstrInputFileName 
Dim gstrOutputFileName 
Dim gobjBinaryInputStream
Dim gobjBinaryOutputStream
Dim gbytearrayReadBinaryFile

    gstrInputFileName =  "some-binary-file.bin"
    gstrOutputFileName = "output-binary-filename.bin"

WScript.Echo "Reading the file data"
    Set gobjBinaryInputStream = CreateObject("ADODB.Stream")
    gobjBinaryInputStream.Type = ADTYPEBINARY
    gobjBinaryInputStream.Open
    gobjBinaryInputStream.LoadFromFile gstrInputFileName
    gbytearrayReadBinaryFile = gobjBinaryInputStream.Read
    gobjBinaryInputStream.Close
    Set gobjBinaryInputStream = Nothing


WScript.Echo "Modifying the file data"
'   These all fail... "Type mismatch"
 '' pwwqbytearrayReadBinaryFile(3) = &H40
 '' pwwqbytearrayReadBinaryFile(3) = ChrB(65)
 '' pwwqbytearrayReadBinaryFile(3) = Chr(65)
 '' pwwqbytearrayReadBinaryFile(3) = AscB("@")
 '' pwwqbytearrayReadBinaryFile(3) = Asc("@")
 '' pwwqbytearrayReadBinaryFile(3) = "@"
 '' pwwqbytearrayReadBinaryFile(3) = 65


WScript.Echo "Writing the file data"
    Set gobjBinaryOutputStream = CreateObject("ADODB.Stream")
    gobjBinaryOutputStream.Type = ADTYPEBINARY
    gobjBinaryOutputStream.Open
    gobjBinaryOutputStream.Write gbytearrayReadBinaryFile
    gobjBinaryOutputStream.SaveToFile gstrOutputFileName, ADSAVECREATEOVERWRITE
    gobjBinaryOutputStream.Close
    Set gobjBinaryOutputStream = Nothing

WScript.Echo 
WScript.Quit
4

1 に答える 1

2

問題は次のとおりです。バイナリストリームは、VBScriptで操作できないバイト配列(TypeName "Byte()"、VarType 8209)を配信および予期します。サンプルタスクの解決策は次のとおりです。

' read first byte from input, write it to output
gobjBinaryOutputStream.Write gobjBinaryInputStream.Read(1)
' skip second byte from input
gobjBinaryInputStream.Position = gobjBinaryInputStream.Position + 1
' use .NET to get a byte array containing '@' and write it to output
gobjBinaryOutputStream.Write CreateObject("System.Text.ASCIIEncoding").GetBytes_4("@")
' copy rest of input to output
gobjBinaryOutputStream.Write gobjBinaryInputStream.Read

明らかに、このアプローチは実際のタスクには対応していません。したがって、バイナリデータをネイティブにサポートする言語の使用を検討する必要があります。

于 2012-07-26T10:06:21.617 に答える