%x不带符号。你这样试试
if (a < 0){
printf("-"); a = 0 - a ;
}//加上这个。
printf("%x ",a);
######
引用来自“中山野鬼”的答案
%x不带符号。你这样试试
if (a < 0){
printf("-"); a = 0 - a ;
}//加上这个。
printf("%x ",a);
输出的结果变成了这样,72 65 67 66 -60 0 0 0 -60 0 0 0 -7d 63 -75 47。还是不对啊,原文是这个7265 6766 3f00 0000 3f00 0000 3f63 3f47。中间有好多的3f,但是每次读取并打印的值都不一样。
######这我就不知道了。就从你目前的代码来看是没问题的。其实我那个"-"是多余(如果你尝试把char 改成 int)。######你查下别的原因,或者把文件传给我。我帮你测一下。
######
printf
(
"%x "
,(unsigned char)a);######
引用来自“中山野鬼”的答案
你查下别的原因,或者把文件传给我。我帮你测一下。
怎么传给你? 那个二进制文件就是windows的注册表文件 在C:\windows\system32\config\SAM
######OK。我马上测一下。用VC写个看看。
######
引用来自“TrulyBelieve”的答案
printf
(
"%x "
,(unsigned char)a);
这个没用,试过了
如果用用char,就是是这样子ffffffa0
######
http://code.google.com/p/srgb/source/browse/printHexString/main.cpp
void printHexStr(const void* buf , size_t size)
{
unsigned char* str = (unsigned char*)buf;
char line[512] = {0};
const size_t lineLength = 16; // 8或者32
char text[24] = {0};
char* pc;
int textLength = lineLength;
for (size_t ix = 0 ; ix < size ; ix += lineLength) {
sprintf(line, "%.8xh: ", ix);
// 打印16进制
for (size_t jx = 0 ; jx != lineLength ; jx++) {
if (ix + jx >= size) {
sprintf(line + (11 + jx * 3), " "); // 处理最后一行空白
if (ix + jx == size)
textLength = jx; // 处理最后一行文本截断
} else
sprintf(line + (11 + jx * 3), "%.2X ", * (str + ix + jx));
}
// 打印字符串
{
memcpy(text, str + ix, lineLength);
pc = text;
while (pc != text + lineLength) {
if ((unsigned char)*pc < 0x20) // 空格之前为控制码
*pc = '.'; // 控制码转成'.'显示
pc++;
}
text[textLength] = '\0';
sprintf(line + (11 + lineLength * 3), "; %s", text);
}
printf("%s\n", line);
}
}
######谢谢你的代码######我试了。代码本身没问题。不过你说的文件SAM。我无法进行COPY。说正在被别的程序使用。我尝试了另一个二进制文件,没有任何问题。 (当然我是用 "rb",不是“rb+")。你如果可以fopen SAM,如果还出现你说的问题。那么可以证明,这个文件本身在不停的被改写。我使用UE打开SAM,也出现文件共享错误,而禁止打开。
######
引用来自“中山野鬼”的答案
我试了。代码本身没问题。不过你说的文件SAM。我无法进行COPY。说正在被别的程序使用。我尝试了另一个二进制文件,没有任何问题。 (当然我是用 "rb",不是“rb+")。你如果可以fopen SAM,如果还出现你说的问题。那么可以证明,这个文件本身在不停的被改写。我使用UE打开SAM,也出现文件共享错误,而禁止打开。
我是复制到了linux下面,操作的,不存在共享的问题