Запись байтов изображения в текстовый файл - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно записать информацию байта изображения в текстовый файл.По большей части, я сделал это, но кажется, что, кодируя байты в UTF8, есть дополнительная информация, закодированная в данных изображения, вещи, которые не принадлежат.В частности, 0xEF и 0xBF последовательно.Я могу только предположить, что это потому, что я кодирую с UTF8.Тогда возникает вопрос: как записать байты изображения в текстовый файл без кодирования данных?

Слева текстовый файл, а справа изображение: enter image description here Я сделал некоторые действительно сложные вещи, и действительно простые вещи.

От этого:

Dim str As String = String.Empty
For Each c In byteArray
    str &= ChrW(c)
Next

На это:

Dim labelFileStream As FileStream = New FileStream(labelPath, FileMode.Append, FileAccess.Write)
Dim labelStreamWriter As StreamWriter = New StreamWriter(labelFileStream)
Dim f_convOutBytes() As Byte = File.ReadAllBytes(f_imagePath)
Dim totalStreamLength As Int32 = f_convOutBytes.Length
Dim labelOutStream(totalStreamLength - 1) As Byte
f_convOutBytes.CopyTo(labelOutStream, 0)
labelStreamWriter.Write(Encoding.UTF8.GetString(labelOutStream))
labelStreamWriter.Close()
labelFileStream.Close()

Если я установлю точку останова перед закрытием потоковой записи и проверим строку, она не будет иметь вседополнительные символы в нем.

ChrW (137) и «PNG» & vbCrLf & ChrW (26) & vbLf & vbNullChar & vbNullChar & vbNullChar & vbCr & "IHDR" & vbNullChar & vbNullChar & vbNullChar & vbNullChar(2) & "Í" & vbNullChar & vbNullChar & vbNullChar & "Ë" & ChrW (4) & ChrW (3) & vbNullChar & vbNullChar & vbNullChar & "g§³" & ChrW (134) & vbNullChCarCharCharCharCharCharCharCharCharCharCharCharCharCharCharChar& ChrW (1) & "sRGB" & vbNullChar & "®Î" & ChrW (28) & "é" & vbNullChar & vbNullChar & vbNullChar & ChrW (4) & "gAMA" & vbNullChar & vbNullChar & "±" "(143) & vbVerticalTab & "üa" & ChrW (5) & vbNullChar & vbNullChar & vbNullChar & "0PLTE" & vbBack & vbBack & vbBack & ChrW (24) & ChrW (24) & ChrW (24) & "HHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.ChrW (136) и ChrW (136) и ChrW (136) и ChrW (152) и ChrW (152) и ChrW (152)lChar & vbNullChar & vbTab & "pHYs" и vbNullChar & vbNullChar & ChrW (14) & "Ã" & vbNullChar & vbNullChar & ChrW (14) & "Ã" & ChrW (1) & "Ço¨bh"& ") ÄIDATxÚí" & ChrW (157) & "I @ SI · Ç" & ChrW (19) & "ðí" & vbTab & "Á½LöV" & vbBack & vbTab & "½l!"& vbFormFeed & "î ^ ËÜ» '"& ChrW (138) &" Bï "& ChrW (26) &" dòí "и ChrW (26) & ChrW (20) &" Á ¥ "& vbFormFeed &" ½ "&ChrW (148) и ChrW (153) & "oÙ" & ChrW (132) & "! ¬Í" & vbNullChar & "®%" & ChrW (16) & "ö" & ... ... ...

Если пойти дальше, кажется, что некоторые символы вызывают это.Определенно не-ASCII символы.Неверные данные enter image description here Позиции неверных данных, переведенных АЭС.enter image description here Ожидаемый вывод с выделенными позициями с неверными данными.enter image description here Сравнение в ряд enter image description here

1 Ответ

0 голосов
/ 17 октября 2018

Проблема в том, что вы берете данные изображения, притворяетесь, как текст, декодируете его в текст с использованием определенной кодировки, а затем записываете его в выходной поток с помощью StreamWriter, который перекодирует текст"снова в байты, скорее всего, с использованием другой кодировки.Даже если вы использовали одну и ту же кодировку для чтения и записи, это было бы проблематично, поскольку не все байтовые массивы являются допустимым текстом, поэтому вы можете потерять некоторые данные при преобразовании (как перевод предложения с английского на испанский, а затем обратно изСнова испанский на английский).Однако, когда вы даже не используете одну и ту же кодировку в обоих направлениях, вы определенно не получите тот же результат.Поскольку это не текст, нет смысла превращать его в текст вообще.Просто оставьте это как ряд необработанных байтов и не изменяйте их значения.

Чтобы скопировать байты из исходного файла изображения в выходной поток, не внося никаких изменений в данные, вы можете сделать это следующим образом:

Using outputStream As New FileStream(outputPath, FileMode.Append, FileAccess.Write)
    Dim imageBytes() As Byte = File.ReadAllBytes(imagePath)
    outputStream.Write(imageBytes, 0, imageBytes.Length)
End Using

Или, еще лучше, еслиВы можете открыть исходный файл изображения в виде потока, вы можете сделать это так:

Using outputStream As New FileStream(outputPath, FileMode.Append, FileAccess.Write)
    Using inputStream As New FileStream(imagePath, FileMode.Open, FileAccess.Read)
        inputStream.CopyTo(outputStream)
    End Using
End Using
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...