将文件转换为二进制(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)然后执行反向路径以获取图像的主要内容,如果未能解决你的问题,请参考以下文章

QT读取二进制文件,然后将其转换为QString

将整数转换为二进制,然后在 python 中进行左位移

在java里面 把 文件转换成二进制流 然后在.net里面 再把二进制流转化成文件.......

将 wav 文件转换为没有标头的原始二进制文件

将MP3转换为二进制

将二进制值转换为字符串并返回二进制?