質問
バイナリ値を含む 2 つの変数がある場合、それらを 1 つのバイナリ値として追加するにはどうすればよいですか?たとえば、WMI を使用して 2 つの REG_BINARY 値のレジストリを読み取る場合、値を連結できるようにしたいと考えます。
'&' 演算子を使用して結合しようとすると、VBScript は型の不一致を報告します。
解決 2
記録のために、失敗の可能性が最も少ないログオンスクリプトとして、大規模なユーザーベースのVBScriptコードが必要でした。私はADOオブジェクトが好きですが、ADOを壊すことができる非常に多くの神秘的な方法があるので、ADODB.Streamを避けます。
代わりに、バイナリコードを16進数にエンコードされた文字列に変換する変換コードを書くことができました。次に、 REG_BINARY
値に書き戻すために、整数の配列に変換し、 SetBinaryValue
WMIメソッドに渡します。
注: WshShell
は4バイトを含む REG_BINARY
値しか処理できないため、使用できません。
フィードバックをありがとう。
他のヒント
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 で結果の配列を取得します。
おそらく...
result = CStr(val1) & CStr(val2)