Vb.net 写一个图像';将字节转换为文本文件

Vb.net 写一个图像';将字节转换为文本文件,vb.net,text,Vb.net,Text,我需要将图像的字节信息写入文本文件。在大多数情况下,我已经做到了,但似乎通过在UTF8中编码字节,有额外的信息被编码到了图像数据中,这些东西不属于我们。最值得注意的是,0xEF和0xBF连续出现。我只能假设这是因为我用UTF8编码。那么问题就变成了,如何在没有编码器干扰数据的情况下将图像字节写入文本文件 左边是文本文件,右边是图像: 我做了一些非常精细的事情,非常简单的事情 由此: Dim str As String = String.Empty For Each c In byteArray

我需要将图像的字节信息写入文本文件。在大多数情况下,我已经做到了,但似乎通过在UTF8中编码字节,有额外的信息被编码到了图像数据中,这些东西不属于我们。最值得注意的是,0xEF和0xBF连续出现。我只能假设这是因为我用UTF8编码。那么问题就变成了,如何在没有编码器干扰数据的情况下将图像字节写入文本文件

左边是文本文件,右边是图像: 我做了一些非常精细的事情,非常简单的事情

由此:

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()
如果我在streamwriter关闭之前设置断点并检查字符串,则它不会包含所有额外字符

ChrW(137)和“PNG”&vbCrLf&ChrW(26)&vbLf&vbNullChar&vbNullChar &vbNullChar&vbCr&“IHDR”&vbNullChar&vbNullChar&ChrW(2)和“Í” &vbNullChar&vbNullChar&vbNullChar&ChrW(4)和ChrW(3)& vbNullChar&vbNullChar&vbNullChar&g§?³&ChrW(134)和vbNullChar &vbNullChar&vbNullChar&ChrW(1)&“sRGB”与vbNullChar&“Δ& ChrW(28)和“é”&vbNullChar&vbNullChar&vbNullChar&ChrW(4)& “gAMA”&vbNullChar&vbNullChar&“±”&ChrW(143)&vbVerticalTab& “üa”&ChrW(5)&vbNullChar&vbNullChar&vbNullChar&vbNullChar&“0PLTE”& vbBack&vbBack&vbBack&ChrW(24)&ChrW(24)&ChrW(24)& “&&&888hhxxxhhxxx”&ChrW(136)&ChrW(136)&ChrW(136)&ChrW(152)& ChrW(152)和ChrW(152)以及ChrW(144)& vbNullChar&vbNullChar&vbNullChar&vbTab&“pHYs”&vbNullChar& vbNullChar&ChrW(14)和“Ô&vbNullChar&vbNullChar&ChrW(14)和“Ô &ChrW(1)和“êoêd”&vbNullChar&vbNullChar&“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)&“oÍ”&vbNullChar&“®%”&ChrW(16)&“ö”&。。。 ... ...

更进一步说,似乎是某些角色造成了这种情况。特别是非ASCII字符。 错误数据 NPP翻译的不正确数据的位置。 突出显示错误数据的位置的预期输出。 并列比较

问题是,您正在获取图像数据,假装它是文本,使用特定的编码将其解码为文本,然后使用
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
或者,更好的方法是,如果您可以将源图像文件作为流打开,您可以这样做:

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

我想我已经确认这是UTF编码。我有一个小程序,可以自动完成我需要的任务。如果我用VSCode打开文件并保存它,它会突然有额外的字符。然后,如果我用Notepad++打开文件并保存,文件将保持原样。Arg.我倾向于使用ASCII。@jmcilhinney我使用什么并不重要。不管出于什么原因,一旦文件被写入,它就会被十六进制EFBF填充在看似随机的位置。也许只是我,但我被你的问题弄糊涂了。您似乎被字节和字符串之间的差异弄糊涂了,并且不清楚字符串编码的含义和目的,但是由于我不能确定您在问什么,我不知道从哪里开始。您在保存、加载或显示时遇到问题吗?如何获取图像的字节数?您能否提供一个简单的示例,其中包括输入数据、预期输出和实际输出。因为我需要在图像数据的开头和结尾附加ASCII命令和设置。我是不是做得太过分了?我添加了输出的并排比较,他们的应用在左边,我的应用在vscode utf8的右边。谢谢!我已经有了类似的作品。现在正在将ASCII字节插入图像数据的开头和结尾。