質問

バイナリ値を含む 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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top