バイナリ値を含む 2 つの変数がある場合、それらを 1 つのバイナリ値として追加するにはどうすればよいですか? たとえば、WMI を使用して 2 つの REG_BINARY 値のレジストリを読み取った場合、値を連結できるようにしたいと考えています。
「&」演算子で結合しようとすると、VBScript は型の不一致を訴えます。
REG_BINARY値は、バイトの配列として返されます。VBScriptは、変数内のバイト配列を参照する場合があり、このバイト配列を別の関数のバリアントとして、またはバイト配列への参照として渡す場合があります。ただし、VBScript自体はアレイに対して何もできません。
連結からいくつかを実行するには、他のコンポーネントが必要になります。-
Function ConcatByteArrays(ra, rb)
Dim oStream : Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1 'Binary'
oStream.Write ra
oStream.Write rb
oStream.Position = 0
ConcatByteArrays = oStream.Read(LenB(ra) + LenB(rb))
oStream.Close
End Function
上記のコードでは、現在サポートされているプラットフォームで広く使用されているADODB.Streamオブジェクトを使用しています。
連結したい複数の配列が実際にある場合は、次のクラスを使用できます。-
Class ByteArrayBuilder
Private moStream
Sub Class_Initialize()
Set moStream = CreateObject("ADODB.Stream")
moStream.Open
moStream.Type = 1
End Sub
Public Sub Append(rabyt)
moStream.Write rabyt
End Sub
Public Property Get Length
Length = moStream.Size
End Property
Public Function GetArray()
moStream.Position = 0
GetArray = moStream.Read(moStream.Size)
End Function
Sub Class_Terminate()
moStream.Close
End Sub
End Class
配列がある回数だけappendを呼び出し、GetArrayを使用して結果の配列を取得します。
記録のために、失敗する可能性が最も低いログオン スクリプトとして、大規模なユーザー ベース用の VBScript コードが必要でした。私は ADO オブジェクトが好きですが、ADO を壊す不可解な方法がたくさんあるので、ADODB.Stream は敬遠しています。
代わりに、2 進数を 16 進数にエンコードされた文字列に変換する変換コードを書くことができました。次に、REG_BINARY
値に書き戻すために、それを整数の配列に変換し、SetBinaryValue
WMI メソッドに渡します。
注: 4 バイトを含む値WshShell
しか処理できないため、使用できません。REG_BINARY
フィードバックありがとうございます。
多分...
result = CStr(val1) & CStr(val2)