编写十六进制字符串时出现问题

时间:2010-04-08 20:36:32

标签: c hex

这是我的代码

/*
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”。

为什么我的代码不起作用?谢谢!

3 个答案:

答案 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;
}

不是世界上最好的代码,但它有效:)。