C 可以用1和0查看二进制文件吗?

C 可以用1和0查看二进制文件吗?,c,C,我的意思是,有没有可能用C写一个程序,编译它,然后看看它在1和0中是什么样子?像1337黑客一样假装用1和0编程是很酷的:p。使用或a查看十六进制字节的二进制文件 十六进制只是查看二进制的一种更简洁的方式。每个十六进制数字(0-F)表示四位。例如,0xF十进制为15,二进制为1111。您可以使用: C:\opt\bin>xxd-b ctags.exe | head 0000000:01001101 01011010 1001000000000000000011 00000000 MZ。。。。 0

我的意思是,有没有可能用C写一个程序,编译它,然后看看它在1和0中是什么样子?像1337黑客一样假装用1和0编程是很酷的:p。

使用或a查看十六进制字节的二进制文件

十六进制只是查看二进制的一种更简洁的方式。每个十六进制数字(0-F)表示四位。例如,
0xF
十进制为15,二进制为1111。

您可以使用:

C:\opt\bin>xxd-b ctags.exe | head 0000000:01001101 01011010 1001000000000000000011 00000000 MZ。。。。 0000006: 00000000 00000000 00000100 00000000 00000000 00000000 ...... 000000c:11111111111111 00000000 00000000 101110000000000。。。。。。 0000012: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 0000018: 01000000 00000000 00000000 00000000 00000000 00000000 @..... 000001e:00000000000000000000000000000000000000000000000000000000000000。。。。。。 0000024: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 000002a:00000000000000000000000000000000000000000000000000000000000000000000。。。。。。 0000030: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 0000036: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 只是为了让这与编程更加相关:

#include <stdio.h>
#include <stdlib.h>

const char *lookup[] = {
   /*  0       1       2       3       4       5       6       7 */
    "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
   /*  8       9       A       B       C       D       E       F */
    "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111",
};

int main(int argc, char *argv[]) {
    FILE *fin;
    int c;
    size_t bytes_read = 0;

    if ( argc != 2 ) {
        fputs("No filename provided", stderr);
        exit(EXIT_FAILURE);
    }

    fin = fopen(argv[1], "rb");
    if ( !fin ) {
        fprintf(stderr, "Cannot open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    while ( EOF != (c = fgetc(fin)) ) {
        printf("%s", lookup[ (c & 0xf0) >> 4 ]);
        printf("%s", lookup[ (c & 0x0f) ]);

        bytes_read += 1;
        if ( bytes_read % 9 == 0 ) {
            puts("");
        }
    }

    fclose(fin);

    return EXIT_SUCCESS;
}
#包括
#包括
常量字符*查找[]={
/*  0       1       2       3       4       5       6       7 */
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
/*8 9 A B C D E F*/
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111",
};
int main(int argc,char*argv[]){
文件*fin;
INTC;
大小\u t字节\u读取=0;
如果(argc!=2){
fputs(“未提供文件名”,标准文件);
退出(退出失败);
}
fin=fopen(argv[1],“rb”);
如果(!fin){
fprintf(stderr,“无法打开%s\n”,argv[1]);
退出(退出失败);
}
而(EOF!=(c=fgetc(fin))){
printf(“%s”,查找[(c&0xf0)>>4]);
printf(“%s”,查找[(c&0x0f)];
字节_read+=1;
如果(字节数_读取%9==0){
认沽权(“”);
}
}
财务总监(财务);
返回退出成功;
}
输出:

C:\Temp> binary.exe c:\opt\bin\ctags.exe | head 010011010101101010010000000000000000001100000000000000000000000000000100 000000000000000000000000111111111111111100000000000000001011100000000000 000000000000000000000000000000000000000000000000010000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000111000000000000000000000 000000000000111000011111101110100000111000000000101101000000100111001101 001000011011100000000001010011001100110100100001010101000110100001101001 011100110010000001110000011100100110111101100111011100100110000101101101 C:\Temp>binary.exe C:\opt\bin\ctags.exe|head 010011010101101010010000000000000000001100000000000000000000000000000100 000000000000000000000000111111111111111100000000000000001011100000000000 000000000000000000000000000000000000000000000000010000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000111000000000000000000000 000000000000111000011111101110100000111000000000101101000000100111001101 001000011011100000000001010011001100110100100001010101000110100001101001 011100110010000001110000011100100110111101100111011100100110000101101101
当然有可能。您可以使用中的信息编写自己的查看器。

您的意思是您不能在头脑中编译操作码并将其转换为二进制


实际上,我学习编程的一台计算机必须通过前面板开关切换引导代码。您需要输入足够的代码,使其能够将加载程序从8启动“软盘驱动器并加载操作系统。你可以看到一张照片。我真的需要知道引导加载程序操作码的二进制文件。

是的。。。。只要用hexeditor打开编译好的程序。。。事实上,人们这样做是为了对东西进行反向工程*。可悲的是,我不得不盯着十六进制内存转储来调试工作中的某些崩溃。我的同事称之为“阅读矩阵”,而我认为这是“吃阿斯匹林的时候了”。如果你碰巧在Linux下运行KDE,KHexEdit是一个很好的十六进制编辑器。+1因为使用了8“软盘。这让我想起了几天我在一个巨大的柜子里与一个拥有64K内存的水冷IBM系统一起度过的时光?“几个操作码,几十个,几百个?”布鲁克斯——我希望我能记得。我不认为会有太多。我很确定我可以切换整个程序,跳过软盘。调试是通过单步遍历内存空间并查看指示1/0的红灯来检查值来完成的。当我将操作系统复制到自己的软盘上时,我得到了我的第一次反盗版讲座,这样我就可以将操作系统和程序放在一个软盘上,而不必切换。这给人留下了持久的印象。我想说的是,许可部门和我现在相处得很好。
#include <stdio.h>
#include <stdlib.h>

const char *lookup[] = {
   /*  0       1       2       3       4       5       6       7 */
    "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
   /*  8       9       A       B       C       D       E       F */
    "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111",
};

int main(int argc, char *argv[]) {
    FILE *fin;
    int c;
    size_t bytes_read = 0;

    if ( argc != 2 ) {
        fputs("No filename provided", stderr);
        exit(EXIT_FAILURE);
    }

    fin = fopen(argv[1], "rb");
    if ( !fin ) {
        fprintf(stderr, "Cannot open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    while ( EOF != (c = fgetc(fin)) ) {
        printf("%s", lookup[ (c & 0xf0) >> 4 ]);
        printf("%s", lookup[ (c & 0x0f) ]);

        bytes_read += 1;
        if ( bytes_read % 9 == 0 ) {
            puts("");
        }
    }

    fclose(fin);

    return EXIT_SUCCESS;
}
C:\Temp> binary.exe c:\opt\bin\ctags.exe | head 010011010101101010010000000000000000001100000000000000000000000000000100 000000000000000000000000111111111111111100000000000000001011100000000000 000000000000000000000000000000000000000000000000010000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000111000000000000000000000 000000000000111000011111101110100000111000000000101101000000100111001101 001000011011100000000001010011001100110100100001010101000110100001101001 011100110010000001110000011100100110111101100111011100100110000101101101