2010-04-08 2 views
0

Вот мой кодПроблемы с записью шестнадцатеричной строки

/* 
gcc -c -Wall -g main.c 
gcc -g -lm -o main main.o 
*/ 

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

void stringToHex(const char* string, char* hex) { 
int i = 0; 

for(i = 0; i < strlen(string)/2; i++) { 
    printf("s%x", string[2*i]); //for debugging 
    sprintf(&hex[i], "%x", string[2*i]); 
    printf("h%x\n", hex[i]); //for debugging 
} 
} 

void writeHex(char* hex, int length, FILE* file, long position) { 
fseek(file, position, SEEK_SET); 
fwrite(hex, sizeof(char), length, file); 
} 

int main(int argc, char** argv) { 
FILE* pic = fopen("hi.bmp", "w+b"); 
const char* string = "f2"; 
char hex[strlen(string)/2]; 

stringToHex(string, hex); 
writeHex(hex, strlen(string)/2, pic, 0); 




fclose(pic); 
return 0; 
} 

Я хочу, чтобы сохранить шестнадцатеричное число 0xf2 в файл (позже мне придется писать большие/длинные номера, хотя). Программа печатает -

s66h36

И когда я использую HexEdit для просмотра файла я вижу число «36» в нем.

Почему мой код не работает? Благодаря!

ответ

1

Это не (абсолютно!), Очевидно из вашего кода, чего вы действительно хотите достичь. Вы начинаете со строкой, содержащей шестнадцатеричных цифр, а затем (по-видимому), пытаясь преобразовать что в шестнадцатеричный ...

Как правило, вы могли бы сделать что-то вроде этого:

int x = 0xf2; 

printf("%0x", x); 
3

Когда его процессов «f», он преобразует его в символ f, который является ascii 102, который является шестнадцатеричным. Вот почему вы получили часть ответа «s66».

% x печатает целое число в шестнадцатеричном представлении.

Я думаю, что вы хотите sscanf(string, "%x", &hexInt)

Это прочтут в строке в виде шестнадцатеричной строки и сохранить его значение в Int hexInt.

+0

Спасибо, что помогает. Но что мне делать, если у меня больше шестнадцатеричных данных, чем 4 байта? Я пытаюсь написать программу, используя вашу строку кода, но она все еще не работает. – quilby

+0

Хорошо, конечно, я исправил это. – quilby

0

Используя ответ muddybruin, я построил this-

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

void stringToHex(char* string, int* hex) { 
    int i = 0; 
    char tmpByte[3] = {'\0', '\0', '\0'}; 

    for(i = 0; i < strlen(string)/2; i++) { 
     memcpy(tmpByte, &string[2*i], 2); 
     sscanf(tmpByte, "%x", &hex[i]); 
    } 
} 

void writeHex(int* hex, int length, FILE* file, long position) { 
    int i = 0; 

    fseek(file, position, SEEK_SET); 
    for(i = 0; i < length; i++) { 
     fwrite(&hex[i], sizeof(char), 1, file); 
     fseek(file, -3/4*sizeof(int), SEEK_CUR); 
    } 
} 

int main(int argc, char** argv) { 
    FILE* pic = fopen("hi.bmp", "w+b"); 
    char* string = "424D460000000000000036000000280000000200000002000000010018000000000010000000130B0000130B000000000000000000000000AAAFFFFF0000FF000000FF000000"; 
    int* hex = calloc(1000, sizeof(int)); 

    stringToHex(string, hex); 
    writeHex(hex, strlen(string)/2, pic, 0); 

    fclose(pic); 
    return 0; 
} 

Не лучший код в мире, но это работает :).

Смежные вопросы