Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将一个二进制文件转换为另一个二进制表示,如图像_C#_C++_C - Fatal编程技术网

C# 如何将一个二进制文件转换为另一个二进制表示,如图像

C# 如何将一个二进制文件转换为另一个二进制表示,如图像,c#,c++,c,C#,C++,C,我想获取一个二进制文件(exe、msi、dll等等),并且能够真正“看到”二进制代码或任何我想要的基(十六进制等等)。我想最简单的方法就是将代码输出到txt中,这样我就可以检查它了 做这件事最好最简单的方法是什么?基本上,我正在寻找转换成我的一个项目的图片二进制代码 类似地,如果我能获取一些二进制代码,然后将其转换为二进制文件,那就太好了 你做这些的方法是什么,我列举了C、C++和C语言,因为这些似乎是最快的编程语言,我想这可能需要一些时间。我想我对C语言的答案更感兴趣,但我主要是在寻找背后的一

我想获取一个二进制文件(exe、msi、dll等等),并且能够真正“看到”二进制代码或任何我想要的基(十六进制等等)。我想最简单的方法就是将代码输出到txt中,这样我就可以检查它了

做这件事最好最简单的方法是什么?基本上,我正在寻找转换成我的一个项目的图片二进制代码

类似地,如果我能获取一些二进制代码,然后将其转换为二进制文件,那就太好了


你做这些的方法是什么,我列举了C、C++和C语言,因为这些似乎是最快的编程语言,我想这可能需要一些时间。我想我对C语言的答案更感兴趣,但我主要是在寻找背后的一些逻辑。

通过调用静态方法ReadAllBytes,可以读取C#或任何.NET语言中文件的所有字节

byte[] allBytes = File.ReadAllBytes("YourPath");
它将把所有字节放入一个数组中


如果您想将其转换为十六进制,请参阅。

我不太确定您想做什么,但听起来有点像您在寻找一个新的

已经为你做了!非常方便的是,二进制文件已经存储在二进制文件中了

下面是一种将字节打包到图像中的方法。。。有趣的是,如果您记录原始文件长度并使用无损图像格式,您可以在以后安全地提取二进制数据

打包为ARGB…

var exefile=Directory.GetFiles(“.”,“*.exe”).First();
var fi=新文件信息(exefile);
变量维度=(int)数学Sqrt((fi.Length+1d)/4);
使用(var位图=新位图(维度,维度+2))
{
//将文件长度存储在第一个像素中。
SetPixel(0,0,Color.FromArgb((int)fi.Length));
var buffer=新字节[fi.Length+4-fi.Length%4];
Copy(File.ReadAllBytes(exefile)、buffer、fi.Length);
int x=1,y=0;
对于(变量偏移量=0;偏移量<缓冲区长度;偏移量+=4)
{
var colorValue=BITCONVER.ToInt32(缓冲区、偏移量);
SetPixel(x,y,Color.FromArgb(colorValue));
x++;
如果(x>=尺寸)
{
x=0;
y++;
}
}
保存(Path.ChangeExtension(exefile,.png),ImageFormat.png);
}
打包为黑白二进制文件…

var-width=(int)Math.Sqrt(fi.Length*8);
宽度=宽度+8-(宽度%8);
变量长度=(整数)(fi.length*8/宽度);
Func getcolor=
(b,m)=>(b&m)==m?颜色。黑色:颜色。白色;
使用(var位图=新位图(宽度、长度+1))
{
var buffer=File.ReadAllBytes(exefile);
int x=0,y=0;
foreach(缓冲区中的变量@字节)
{
SetPixel(x+0,y,getcolor(@byte,0x80));
SetPixel(x+1,y,getcolor(@byte,0x40));
SetPixel(x+2,y,getcolor(@byte,0x20));
SetPixel(x+3,y,getcolor(@byte,0x10));
SetPixel(x+4,y,getcolor(@byte,0x8));
SetPixel(x+5,y,getcolor(@byte,0x4));
SetPixel(x+6,y,getcolor(@byte,0x2));
SetPixel(x+7,y,getcolor(@byte,0x1));
x+=8;
如果(x>=宽度)
{
x=0;
y++;
}
}
保存(Path.ChangeExtension(exefile,.tif),ImageFormat.Tiff);
}

。。。是的,你的问题似乎引发了噪音,我在讨论中迟到了一点,但我想知道这有多容易。下面是一个最小实现,它为您提供当前正在执行的程序集(即当前正在运行的EXE)的二进制输出:


以下是在C中打印1和0字节的代码:

#include <stdio.h>

void putbits(unsigned char byte)
{
    unsigned char mask = 0x01;

    for (int bit = 7; bit >= 0; bit--)
    {
        if ((mask << bit) & byte)
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
    }

    // Uncomment the following line to get each byte on it's own line.
    //printf("\n");
}

int main (int argc, const char * argv[])
{
    int c;

    while ((c = getchar()) != EOF)
    {
        putbits(c);
    }

    return 0;
}
#包括
无效位(无符号字符字节)
{
无符号字符掩码=0x01;
对于(int位=7;位>=0;位--)
{

如果((掩码)“转换”是什么意思?这些文件已经是二进制文件了。很抱歉,我可能应该使用更好的术语。我想检查程序的二进制代码,对其进行处理,然后将其转换回有效文件。哇!完全是双彩虹!这意味着什么?@Abel:C--确实存在。它是一种类似于C的语言,但更简单,设计为中间语言b在汇编语言和高级语言之间,可以轻松地自动生成和编译。另请参见这个问题,因为它会产生大量的混乱。我知道。我如何才能看到这个二进制代码并轻松编辑它。我想我喜欢十六进制编辑器,但二进制编辑器lol。@Brian:hex编辑器是二进制编辑器:它向您展示了b的可视化表示二进制代码,通常用十六进制完成,逐字节。当你在十六进制编辑器中编辑时,它将转换回该字节的基本二进制表示形式。我不想用十六进制看到它。我想用二进制看到它。我不会手动编辑它,而是应用一种技术。我想他只想看到1和0。@Brian:你看不到二进制。就像你看不到数据库中的BLOB一样。看到它的唯一方法是使用某种表示法。图像会告诉你little、hex、octal、binary(零/一)是字符串表示法。但是你的想法很有趣,没用,但很有趣:为它制作图像是另一种非二进制表示法(在图片查看器中)在另一个二进制格式(图像文件)的二进制文件(原始EXE)。混乱?是的,但可以从十六进制转换为二进制或其他。我不认为他们在十六进制编辑器中有“二进制模式”,但我想我应该谷歌它。我仍然需要将此代码提取到一些我可以自动处理的东西(txt文件或其他东西)你不能在头脑中从十六进制转换为二进制?这就是十六进制的全部意义。这就是十六进制编辑器在生活中的全部目的,所以这几乎可以肯定是你想要的。好的。我想为1制作一个黑色像素,为0制作一个白色像素。这就是为什么我需要“看”二进制。我想我可以从十六进制编辑器复制并粘贴十六进制,然后
var width = (int)Math.Sqrt(fi.Length * 8);
width = width + 8 - (width % 8);
var length = (int)(fi.Length * 8 / width);

Func<byte, int, Color> getcolor =
        (b, m) => (b & m) == m ? Color.Black : Color.White;

using (var bitmap = new Bitmap(width, length + 1))
{
    var buffer = File.ReadAllBytes(exefile);

    int x = 0, y = 0;
    foreach (var @byte in buffer)
    {
        bitmap.SetPixel(x + 0, y, getcolor(@byte, 0x80));
        bitmap.SetPixel(x + 1, y, getcolor(@byte, 0x40));
        bitmap.SetPixel(x + 2, y, getcolor(@byte, 0x20));
        bitmap.SetPixel(x + 3, y, getcolor(@byte, 0x10));

        bitmap.SetPixel(x + 4, y, getcolor(@byte, 0x8));
        bitmap.SetPixel(x + 5, y, getcolor(@byte, 0x4));
        bitmap.SetPixel(x + 6, y, getcolor(@byte, 0x2));
        bitmap.SetPixel(x + 7, y, getcolor(@byte, 0x1));

        x += 8;
        if (x >= width)
        {
            x = 0;
            y++;
        }
    }

    bitmap.Save(Path.ChangeExtension(exefile, ".tif"), ImageFormat.Tiff);
}
byte[] bytes = File.ReadAllBytes(Assembly.GetExecutingAssembly().Location);

// this can get large, we know how large, so allocate early and try to be correct
// note: a newline is two bytes
StringBuilder sb = new StringBuilder(bytes.Length * 3 + (bytes.Length / 16) * 4);

for (int i = 0; i < bytes.Length; i++)
{
    sb.AppendFormat("{0:X2} ", bytes[i]);
    if (i % 8 == 0 && i % 16 != 0)
        sb.Append("  ");
    if (i % 16 == 0)
        sb.Append("\n");

}
5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 50
#include <stdio.h>

void putbits(unsigned char byte)
{
    unsigned char mask = 0x01;

    for (int bit = 7; bit >= 0; bit--)
    {
        if ((mask << bit) & byte)
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
    }

    // Uncomment the following line to get each byte on it's own line.
    //printf("\n");
}

int main (int argc, const char * argv[])
{
    int c;

    while ((c = getchar()) != EOF)
    {
        putbits(c);
    }

    return 0;
}
gcc main.c --std=c99 -o printer
./printer < printer > printer.txt