在保存到文件之前在VBA中编辑十六进制流

时间:2017-03-03 05:04:34

标签: excel-vba hex hexdump vba excel

后台:我正在使用ADODB连接提取保存在SQL数据库中的文件。数据库的一列是文件名,包括文件扩展名,另一列是文件的实际内容,作为十六进制流。我想保存此文件并将其打开。

问题:这适用于.pdf文件。但是,使用.png文件时出现错误 - 当我尝试打开文件时文件已损坏。我使用了十六进制编辑器(HxD)并注意到有多余的值。如果我删除这些文件打开正常。十六进制流应以“per mille”字符(excel中的Chr(137))开头,以便打开文件。我还没有找到一种方法来编辑excel中的十六进制流而不将其转换为字符。

当我使用十六进制编辑器取出前几个字符时,.png文件打开没有问题,因此文件以:

开头

‰PNG

或十六进制代码中的等价物:

89 50 4E 47

多余的字符是

ÿþ

或十六进制代码中的等价物:

FF FE

(我想删除这些)。即使我使用

从文本字符串中删除4个字符,这些字符也在保存的文件中
Content = Right(Content, Len(Content) - 4)

当我保存文件时,它几乎就像在字符串之前自动添加一样。

代码:

调用save to file函数,其中Content是文件内容,Name是文件名:

Call StringToTextFile("C:\", rst![Content], rst![Name])

功能如下:

Public Sub StringToTextFile(ByVal directory As String, ByVal Content As String, ByVal filename As String)
'Requires reference to scrrun.dll
Dim fso As Scripting.FileSystemObject
Dim ts As Scripting.TextStream
Set fso = New Scripting.FileSystemObject

If Right(filename, 4) = ".png" Then         'recognizing the .png file
'Content = CByte(Chr(137)) & Right(Content, Len(Content)) 'unsuccessful attempt at inserting "per mille" character
'iret = InStr(0, Chr(137), Content, vbBinaryCompare)  'unsuccessful attempt at finding the "per mille" character in the content

End If

Set ts = fso.CreateTextFile(directory & filename, True, True)
ts.Write Content
ts.Close

Dim myShell As Object
Set myShell = CreateObject("WScript.Shell")
myShell.Run directory & filename          'Open the saved file

End Sub

当我尝试使用Chr(137)插入“per mille”字符时,它只是在十六进制编辑器中显示一个空格。

任何帮助表示赞赏!

这似乎是类似的讨论,但我不确定如何将此应用于我的案例: excel-vba-hex-to-ascii-error

0 个答案:

没有答案