将文件转换为二进制(11111111110)然后执行反向路径以获取图像
Posted
技术标签:
【中文标题】将文件转换为二进制(11111111110)然后执行反向路径以获取图像【英文标题】:Convert file to binary (11111111110) then do the reverse path to get the image 【发布时间】:2021-09-02 18:21:47 【问题描述】:我有一张 jpg 图像,可以将其转换为二进制数序列,但之后无法恢复。它最终损坏了。
using System;
using System.IO;
using System.Net.Mime;
using System.Text;
namespace ConsoleApp1
class Program
static void Main(string[] args)
string inputFilename = "test.jpg";
byte[] fileBytes = File.ReadAllBytes(inputFilename);
var test = ToBinaryString(fileBytes);
byte[] bytes = Encoding.ASCII.GetBytes(test);
string fileresult = Convert.ToBase64String(bytes);
byte[] fileresutl2 = Convert.FromBase64String(fileresult);
File.WriteAllBytes("C:/Users/Florian/RiderProjects/ConsoleApp1/ConsoleApp1/bin/Debug/net5.0/test7.txt", fileresutl2);
string text = System.IO.File.ReadAllText("C:/Users/Florian/RiderProjects/ConsoleApp1/ConsoleApp1/bin/Debug/net5.0/test7.txt");
var result = Convert.ToBase64String(FromBinaryString(text));
File.WriteAllBytes("C:/Users/Florian/RiderProjects/ConsoleApp1/ConsoleApp1/bin/Debug/net5.0/test8.jpg", FromBinaryString(test));
Console.WriteLine(test);
public static string ToBinaryString(byte[] array)
var s = new StringBuilder();
foreach (byte b in array)
s.Append(Convert.ToString(b, 2));
return s.ToString();
public static byte[] FromBinaryString(string s)
int count = s.Length / 8;
var b = new byte[count];
for (int i = 0; i < count ; i++)
b[i] = Convert.ToByte(s.Substring(i * 8, 8), 2);
return b;
我看不出什么会损坏我的文件。 对不起,文件的组织,它只是一个快速编码的测试代码。
【问题讨论】:
您的意思是将“结果”写入磁盘而不是调用两次“FromBinaryString”吗? 结果写入磁盘但无法打开已损坏的图像 FromBinaryString 仅调用一次 因此,您可以在下面写的答案旁边调查一些事情。您读取文件字节,然后将其转换为二进制字符串,然后获取二进制字符串的 ASCII 字节,然后将 ASCII 字节转换为 Base 64 并返回,然后将结果存储到文本文件中。然后,当您读取文本文件时,您只需尝试再次将字节数组写入磁盘。似乎过于复杂。也许您可以在这里使用示例:***.com/questions/24106687/… 【参考方案1】:代码中有一些奇怪的东西,例如无用地转换为base64并返回,但让我们直接进入问题的核心:将字节转换为二进制字符串
public static string ToBinaryString(byte[] array)
var s = new StringBuilder();
foreach (byte b in array)
s.Append(Convert.ToString(b, 2));
return s.ToString();
从表面上看,这似乎是合理的。字节进入,一个二进制字符串出来。但这里有一些例子,我希望能让你相信这种转换存在问题:
Console.WriteLine(ToBinaryString(new byte[]1, 1));
Console.WriteLine(ToBinaryString(new byte[]3));
(https://ideone.com/y6dB1Z)
这两个都是“11”。这很糟糕,这意味着转换是不可逆的。它出错的原因是最重要的零被丢弃,然后下一个字节“移动到”那个位置。正如您的解码函数所期望的那样,每个字节都应该用 8 位来表示。例如:
public static string ToBinaryString(byte[] array)
var s = new StringBuilder();
foreach (byte b in array)
s.Append(Convert.ToString(b, 2).PadLeft(8, '0'));
return s.ToString();
顺便说一句,你实际上不应该使用这样的东西(除非在试验时,看起来你正在做的事情,所以没关系),它扩大了文件大小8 倍,实际上并没有做任何有用的事情。例如,如果您要解码 JPG,请直接使用文件的字节,而不是使用“文件作为二进制字符串”。即使是霍夫曼代码也不应该那样做。
【讨论】:
谢谢你的工作,我的初始转换确实出错了以上是关于将文件转换为二进制(11111111110)然后执行反向路径以获取图像的主要内容,如果未能解决你的问题,请参考以下文章