Как исправить поврежденные docx файлы программно (добавив недостающие байты)
Я пытаюсь починить большую порцию испорченной .docx
файлы в классическом ASP.
(В файлах отсутствуют байты в конце - как подробно описано в этом вопросе).
Когда я смотрю на файл в Sublime (который показывает его в шестнадцатеричном представлении), повреждение можно исправить, добавив 0000
в конец файла.
Но я изо всех сил пытаюсь добавить эти 4 нуля в конец программно.
Я пытаюсь использовать класс cByteArray, использование которого выглядит следующим образом:
With oByte
Call .AddBytes(LoadBytes(sFilePath))
Call .AddBytes(HOW DO I GET THE BYTE VALUE OF 0000 HERE?)
lngBytes = .BytesTotal
ByteArray = .ReturnBytes
End With
Call SaveBytesToBinaryFile(ByteArray, sNewFilePath)
Я не могу понять, как получить 0000
значение в .AddBytes()
метод.
Как я могу это сделать? Я немного не в себе и не уверен, что я даже подхожу к этому правильно.
По моему незнанию, вот что я попробовал:
Redimming ByteArray
оставляя лишние байты пустыми (потому что я думаю, что 0000
представляют нулевые значения).
Это, кажется, не меняет файл вообще. Новый сохраненный файл идентичен старому файлу.
With oByte
Call .AddBytes(LoadBytes(sFilePath))
ByteArray = .ReturnBytes
End With
arrayLength = ubound(ByteArray)
redim ByteArray(arrayLength + 2)
Call SaveBytesToBinaryFile(ByteArray, sNewFilePath)
преобразование 0000
из шестнадцатеричных в байты и добавление его в поврежденный файл байтов
Опять же, это, похоже, не меняет файл вообще.
dim k, hexString, str, stream, byteArrToAdd
hexString = "000000"
For k = 1 To Len(hexString) Step 2
str = str & Chr("&h" & Mid(hexString, k, 2))
response.write "<hr />" & str & "<hr />"
Next
Set stream = CreateObject("ADODB.Stream")
With stream
.Open
.Type = 2 ' set type "text"
.WriteText str
.Position = 0
.Type = 1 ' change type to "binary"
byteArrToAdd = .Read
.Close
End With
set stream = nothing
With oByte
Call .AddBytes(LoadBytes(sFilePath))
Call .AddBytes(byteArrToAdd)
ByteArray = .ReturnBytes
End With
Call SaveBytesToBinaryFile(ByteArray, sNewFilePath)
Получение последнего байта поврежденного файла и добавление его к 2 новым значениям после повторной обработки ByteArray.
Это, кажется, не меняет файл вообще!!
With oByte
Call .AddBytes(LoadBytes(sFilePath))
ByteArray = .ReturnBytes
End With
arrayLength = ubound(ByteArray)
finalByte = ByteArray(arrayLength)
redim ByteArray(arrayLength + 2)
ByteArray(arrayLength + 1) = finalByte
ByteArray(arrayLength + 2) = finalByte
Call SaveBytesToBinaryFile(ByteArray, sNewFilePath)
1 ответ
Вы можете использовать поток двоичных файлов с помощью определенной пользователем функции преобразования (string to byte()), как показано ниже.
Function GetBytesOf(str) 'returns bytes of given string
With CreateObject("Adodb.Stream")
.Type = 2 'text
.Charset = "x-ansi"
.Open
.WriteText str
.Position = 0
.Type = 1 'binary
GetBytesOf = .Read 'returns Byte()
.Close
End With
End Function
Dim patch
patch = GetBytesOf(Chr(0) & Chr(0)) 'equals to WORD 0000
With CreateObject("Adodb.Stream")
.Type = 1 'binary
.Open
.LoadFromFile sFilePath
'move cursor to the end of file
.Position = .Size
.Write patch
.SaveToFile sNewFilePath, 2 '2 for overwrite if exists
.Close
End With