这是我的代码
/*
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”。
为什么我的代码不起作用?谢谢!
答案 0 :(得分:3)
当它处理“f”时,它将它转换为字符f,即ascii 102,这是十六进制66.这就是你得到答案的“s66”部分的原因。
%x以十六进制表示形式打印出一个整数。
我想你想要sscanf( string, "%x", &hexInt )
这将在字符串中读取十六进制字符串并将其值保存在int hexInt中。
答案 1 :(得分:1)
从你的代码中可以明白你真正想要实现的目标。你从一个包含十六进制数字的字符串开始,然后(显然)试图将转换为到十六进制...
通常,你会做这样的事情:
int x = 0xf2;
printf("%0x", x);
答案 2 :(得分:0)
使用muddybruin的答案我建立了这个 -
#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;
}
不是世界上最好的代码,但它有效:)。