Как исправить поврежденные 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
Другие вопросы по тегам