我选择以十六进制存储为blob数据的docx文件,我需要检索这些文件,以便我可以访问其中的文本。
到目前为止,我已使用以下内容将十六进制转换为字符串格式:
Dim blob = BLOB DATA
Dim con As String = String.Empty
For x = 2 To st.Length - 2 Step 2
con &= ChrW(CInt("&H" & st.Substring(x, 2)))
Next
但是,如果我将此输出保存为.docx,则文件将无法打开,因为它已“损坏”。我认为这就是为什么当我将此字符串加载到内存流然后尝试使用Novacode.DocX.Load(memoryStream)时,它会给我一个类似的损坏错误。
我试过以两种方式分割成字节数组,两者都给我不同的结果。
System.Text.Encoding.Default.GetBytes(hex)
我也试过了。
Public Function HexToByteArray(hex As String) As Byte()
Dim upperBound As Integer = hex.Length \ 2
If hex.Length Mod 2 = 0 Then
upperBound -= 1
Else
hex = "0" & hex
End If
Dim bytes(upperBound) As Byte
For i As Integer = 2 To upperBound
bytes(i) = Convert.ToByte(hex.Substring(i * 2, 2), 16)
Next
Return bytes
End Function
然后我尝试将它们转换为内存流并使用它们创建一个DocX对象,如下所示:
Dim doc As DocX = DocX.Load(New MemoryStream(bytes))
答案 0 :(得分:0)
docx不是文本格式,它是二进制格式。因此,将其转换为字符串是完全错误的。您的最终结果必须是字节数组。
知道这一点,你的问题可以分成两个更简单的问题:
将十六进制字符串拆分为两个字符的字符串。有关详细信息,请参阅此SO问题(或保留现有的循环,这非常好):
将包含字节十六进制表示的“小”字符串转换为字节。有关详细信息,请参阅此SO问题:
结合这两种解决方案留给读者练习。我们不想破坏所有的乐趣或破坏学习体验。 ; - )