2017-02-08 26 views
2

Я пытаюсь восстановить большую партию поврежденных файлов .docx в классическом asp.Как исправить поврежденные файлы docx программно (добавление отсутствующих байтов)

(В конце файла отсутствуют байты в конце - как указано в this question).

Когда я смотрю на файл в Sublime (который показывает его в шестнадцатеричном представлении), повреждение можно устранить, добавив 0000 в конец файла.

enter image description here

Но я изо всех сил, чтобы добавить эти 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-х новых значений после redimming 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) 
+0

Вы должны иметь возможность добавлять их с помощью 'ChrB()', что-то вроде '.AddBytes вызовов (ChrB (& H00) & ChrB (& H00))' должна работать. – Lankymart

+0

Я не мог заставить это работать. То же самое для 'ControlChars.NullChar' - не добавлено ни одного байта в файл. Считаете ли вы, что это связано с этим? http://www.vbforums.com/showthread.php?628175-CHR(-amp-H00)-vs-CHR-(-amp-H00) (к сожалению, там нет решения) –

+0

Прошу прощения за человека. ..Все еще используя классический asp в ноябре 2017 года:/ – 2Noob2Good

ответ

2

Вы можете использовать бинарный файловый поток с помощью определенного пользователем преобразования (строка в) байт() функции, как в следующем.

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 
+1

Большое спасибо. Это намного проще, чем все, что я пробовал, и он отлично работает. Много радости :) –

+0

@MartinHansenLennox рада помочь. –

 Смежные вопросы

  • Нет связанных вопросов^_^