将文件转换为二进制文件以插入 xml 文件

Convert a file to binary for insertion in an xml file

如果我查看 MS Infopath XML 文件的内部,附件似乎是存储在标签之间的某种 ASCII 二进制代码。我没有确定的背景,所以我不确定。这应该很容易用 VBA 我想。

我使用的代码如下。在这种情况下,我试图从我可以嵌入的 Excel 文件中获取文本。如果您 运行 该代码,则错误应该是关于参数类型错误的问题。在这种情况下,我引用了一个 Excel 文件,但它可能是很多东西。

标签之间的代码是这样的:stu2zAQvBfIPwi8BhadFCiKwnIOSXNMA8QFeqWptUWYr5Lr1P77rqg4MQLHimoCzUWURHJmdpaPnVxtjC4eI

我不知道这是否有帮助,但我不知道该怎么做。

Const adTypeBinary = 1Const adTypeText = 2
Const adModeReadWrite = 3


Sub RunThis()
    bin2var "c:\documents\IYYMMCC Validation.xlsx"
End Sub


Function bin2var(filename As String) As String
    Dim f As Integer
    f = FreeFile()
    Open filename For Binary Access Read Lock Write As #f
        bin2var = Space(FileLen(filename))
        Get #f, , bin2var
        thestring = BytesToString(bin2var, CdoUS_ASCII)
    Close #f
End Function


Function BytesToString(bytes, charset)
    With CreateObject("ADODB.Stream")
        .Mode = adModeReadWrite
        .Type = adTypeBinary
        .Open
        .Write bytes
        .Position = 0
        .Type = adTypeText
        .charset = charset
        BytesToString = .ReadText
    End With
End Function

The code between the tags...

...很可能是 Base64.
因此,使用 Base64 编码器将二进制文件编码为 Base64 格式,然后将该字符串包含到 XML 文件中。

假设您使用 VisualBasic,快速搜索显示 this solution

这是我找到的解决方案。我正在使用它来将文件转换为本例中所需的 Base64:

Function EncodeBase64ForString(strString As String) As String
Dim arrData() As Byte

  arrData = StrConv(strString, vbFromUnicode)

  Dim objXML As MSXML2.DOMDocument60
  Dim objNode As MSXML2.IXMLDOMElement

  Set objXML = New MSXML2.DOMDocument60
  Set objNode = objXML.createElement("b64")

  objNode.DataType = "bin.base64"
  objNode.nodeTypedValue = arrData
  EncodeBase64ForString = objNode.text

  Set objNode = Nothing
  Set objXML = Nothing
End Function

Public Function GetFileBytes(ByVal strPath As String) As Byte()
Dim lngFileNum As Long
Dim bytRtnVal() As Byte

    lngFileNum = FreeFile

    If LenB(Dir(strPath)) Then ''// Does file exist?
        Open strPath For Binary Access Read As lngFileNum
        ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte
        Get lngFileNum, , bytRtnVal
        Close lngFileNum
    Else
        Err.Raise vbObjectError + 1, , "Could not find " & strPath
    End If

    GetFileBytes = bytRtnVal

    Erase bytRtnVal
End Function