Tag: 二进制

二进制到无符号int,使用C中的按位运算和指针运算

我只能使用按位运算和指针运算来解决这个问题。 我正在从二进制转换为unsigned int。 我写的function是: unsigned int atob(const char* nptr); atob(“101”)应返回5,atob(“11000”)应返回24,atob(“11 $”)应返回3,atop(“”)应返回0。 我对按位操作很新,所以我真的需要一些专门的帮助。 编辑: nptr只能递增,而不允许其他inc / dec。

如何在c中读取TIFF文件头?

我如何在c中读取tiff文件头? 实际上我想学习TIFF Tag ImageWidth和TIFF Tag ImageLength。 我怎样才能访问这个属性? http://www.awaresystems.be/imaging/tiff/tifftags/imagewidth.html http://www.awaresystems.be/imaging/tiff/tifftags/imagelength.html 这段代码的c翻译可以帮助我: https://stackoverflow.com/a/9071933/2079158 我不知道, 试过这样的事情: #include “stdio.h” #include “stdlib.h” main() { FILE* f = fopen(“tifo.tif”, “rb”); unsigned char info[500]; fread(info, sizeof(unsigned char), 500, f); long int width = *(long int*)&info[256]; short int height = *(short int*)&info[257]; printf(“width : %d \n”, width); printf(“height : %d \n”, height); fclose(f); […]

理解递归十进制到二进制代码?

我正在开发一个可以将数字转换为二进制forms的程序。 在帮助下,我能够得到它,它似乎工作,但我只是不明白如何。 我想最好的方法是尝试解释我认为这是如何工作的,有人可以纠正我。 我有一个函数,它有一个if语句,表示如果n除以2不等于0则将n除以2.然后如果n / 2则为1或0,则打印余数。 main函数只运行我给它的任何数字的函数,在本例中为456。 但程序如何知道多次运行该函数以获得整个二进制forms? 我觉得这并不复杂,但我没有得到它。 #include void ConvertToBinary(int n) { if (n / 2 != 0) { ConvertToBinary(n / 2); } printf(“%d”, n % 2); } int main (){ ConvertToBinary (456); return 0; }

特定内存地址的内容与gdb中预期的不同

我有类型为int的变量i,其值为129.我在gdb中使用了此变量的各种表示。 # Decimal format of i (gdb) p/di $18 = 129 # Binary format of i (gdb) p/ti $19 = 10000001 # Address of variable i (gdb) p &i $20 = (int *) 0xbffff320 # Binary format displayed at one byte (gdb) x /tb &i 0xbffff320: 10000001 # Decimal format displayed at four bytes (one […]

在C中的文件中读写(加倍)

我试图读取一个文件,读取它包含的字节数,然后将其四舍五入到最接近的GB,然后将文件大小加倍。 但是,有没有办法读取文件,然后一些做所有这些东西回到同一个文件? 这是我到目前为止所做的,但它创建了一个包含新内容的新文件,但我不确定我的逻辑是否正确 另外,你用#define创建一个像BYTE一样的常量吗? 就测试用例而言,我只使用byte作为int并使其等于50 #include #include #include #include // #define BYTE 50 int main() { FILE *fp1, *fp2; int ch1; clock_t elapsed; char fname1[40], fname2[40]; char a; printf(“Enter name of the file:”); fgets(fname1, 40, stdin); while ( fname1[strlen(fname1) – 1] == ‘\n’) { fname1[strlen(fname1) -1] = ‘\0’; } fp1 = fopen(fname1, “r”); if ( […]

有趣的可执行文件的二进制转储

出于某种原因,我在C中创建了简单的程序来输出给定输入的二进制表示: int main() { char c; while(read(0,&c,1) > 0) { unsigned char cmp = 128; while(cmp) { if(c & cmp) write(1,”1″,1); else write(1,”0″,1); cmp >>= 1; } } return 0; } 编译后: $ gcc bindump.c -o bindump 我做了简单的测试来检查程序是否能够打印二进制文件: $ cat bindump | ./bindump | fold -b100 | nl 输出如下: http : //pastebin.com/u7SasKDJ 我怀疑输出看起来像随机系列的1和0。 但是,输出部分似乎更有趣。 例如,看看第171行和第357行之间的输出。我想知道为什么与可执行文件的其他部分相比有很多零 […]

更改已编译二进制文件的部分

学习英语作为第二个郎,对错误和尴尬感到抱歉 我已经给出了一个特殊的项目。 该公司已丢失该应用程序的源代码,我必须对其进行更改。 现在,逆向工程整个事情对于一个人来说是不可能的,它太过庞大,但是修补个别function是可行的,因为这些变化并不是那么具有纪念意义。 因此,一种可能的解决方案是编译C代码,然后以某种方式 – 重写地址 – 将其修补到实际二进制文件中,理想情况下,替换CALL指令跳转到的代码,或者将JMP插入到我的代码中。 有没有办法用MingW32来实现这个目的? 如果是,您能提供一个简单的例子吗? 我也对可以帮助我完成任务的书籍感兴趣。 谢谢你的帮助

C中的Shift运算符取代了零而不是零

这是代码: #define u8 char #define u32 unsigned int typedef struct { //decoded instruction fields u8 cond; // Condition (f.ex. 1110 for always true) u8 instruction_code; // Is a constant since we only use branch u32 offset; // Offset from current PC } dcdinst; u8 mem[1024]; mem[0x0] = 0b11101010; u8* instruction_addr = &mem[pc]; if (instruction_addr == […]

使用Pure C显示PGM图像(p5)中的直方图像素值,不带任何图像处理库

这个问题对于使用纯C更好地理解图像处理是一项挑战。我已经使用C编译的GCC完成了一个读取非二进制PGM文件的简单程序。 现在,当我尝试读取二进制PGM文件时,它正成为一个问题。 可以通过使用IrvanView将JPG转换为PGM来获取该二进制PGM文件。 注意:请不要回答任何图像处理库(例如:OpenCV)。 我目前的代码是: #include #include #define WIDTH 1024 #define HEIGHT 768 #define READ_IMAGE_NAME “MY_PGM_FILE_NAME.pgm” void print_histogram_table(int *histog); main() { FILE *fp; int i,j, height= HEIGHT, width=WIDTH; char line[100]; // Color depth is 255. unsigned char pixel_value; fp = fopen(READ_IMAGE_NAME,”r”); // get the first four lines. fgets (line,100,fp); fgets (line,100,fp); fgets (line,100,fp); fgets (line,100,fp); […]

左移算子

如果我有以下内容: char v = 32; // 0010 0000 然后我做: v << 2 这个号码是负面的。 // 1000 0000 -128 我读了标准,但只写了: 如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为是未定的。 所以我不明白,如果一个规则是,如果有一点在大多数左边的位上,那么这个数字必须从负数开始。 我正在使用GCC。