2016-12-21 11 views
0

Я пытаюсь преобразовать буфер в шестнадцатеричную строку в C как ниже, ниже изображений входного файл enter image description here это двоичный файл.вопрос преобразование буфера шестнадцатеричной строки в с

#include "stdio.h" 
#include "stdlib.h" 

#include "string.h" 
#include "fcntl.h" 


#if defined(_MSC_VER) 
#include <BaseTsd.h> 
typedef SSIZE_T ssize_t; 
#endif 

#define BUFF_SIZE 5  

int main() 
{ 
    char  buff[BUFF_SIZE]; 
    int  fd; 
    ssize_t rd_size; 
    FILE *rfp; 
    FILE *ofp; 
    ofp = fopen("output.txt", "w"); 
    rfp = fopen("test.bin", "rb"); 


     while (4== (fread(buff, 1, 4, rfp))) 
     { 
      fprintf(ofp, "%02X%02X%02X%02X \n", buff[0], buff[1], buff[2], buff[3]); 
     } 

    fclose(ofp); 
    fclose(rfp); 
    return 0; 
} 

то я использую выше код, у меня есть ящик в шестнадцатеричный файл , но у меня есть проблемы в результате.

04002B2B 
000001FFFFFFFF 
00030003 
00000000 
00000000 
00000000 
00000300 
00000000 
00000000 
00000000 
00000000 
00000000 
00000000 
00000000 
00500050 
00500050 
00500050 
00500050 
00000000 
FFFFFF80002000 
00000000 
08700F00 
00000000 
00000000 
00000001 
00000002 
00000003 
00000004 
00000005 
00000006 
00000007 
FFFFFF800FFFFFFFF01E 
087007FFFFFF80 
00320032 
0BFFFFFFB80820 
00050005 
2DFFFFFFC7114D 
00FFFFFFC20118 
00001B58 

Как вы можете видеть, что выше файл, тем более я не хочу «000001FFFFFFFF» этот вывод. Но я не знаю, что я должен сделать

обновления

Я хочу работать в Linux. но если я сделаю файл выполнения, я получил ошибку segmant. Можете ли вы сообщить мне, что я должен делать?

ответ

2

Основная проблема здесь состоит в том, что ваш char тип, кажется, signed (если char является signed или unsigned конкретной реализации). Это означает, что значения, большие или равные 0x80, будут рассматриваться как отрицательные значения (с системами two's complement).

И когда вы передаете такое значение printf, а значение равно promoted на номер int, оно является расширенным. Таким образом, 0xff становится 0xffffffff, который затем печатается.

Если вы используете вместо unsigned char свои значения, то значения 0xff не распространяются при повышении на unsigned int. Таким образом, 0xff - 0x000000ff, а ведущие нули не печатаются.


Другая проблема заключается в том, что вы используете неправильный формат для printf. Формат "%x" для unsigned int, а не unsigned char. Если вы читаете, например. this printf (and family) reference вы увидите большую таблицу со всем кодом форматирования и префиксами разных размеров для разных типов. Для печати unsigned char вы должны использовать префикс hh, как в "%hhx".

+0

быстрый вопрос. Я хочу работать в Linux с gcc, но у меня есть ошибка segmant, – grander3

+0

@ grander3 Это еще одна проблема целиком и что-то, о чем вы должны написать новый вопрос. Но прежде чем вы это сделаете, используйте отладчик, чтобы узнать, где происходит авария. В источнике, который вы показываете, укажите местоположение аварии с комментарием. Также покажите значения всех задействованных переменных в момент сбоя. О, и когда вы поймаете крах, обязательно поднимите колл-стоп на * ваш * код. –

+0

@ grander3 Также, пожалуйста [загляните в тур] (http://stackoverflow.com/tour) и [читайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). Это поможет вам здесь, на stackoverflow.com. –