从4字节编号写入4字节十六进制

时间:2015-07-14 22:09:27

标签: c++

对于流的头文件,我需要写4个字节来表示一个数字(流序列)。

std::srand(time(0));
// Get a 4 byte number:
uint32_t t = static_cast<uint32_t>(std::rand());

现在我不知道如何获得该数字的十六进制表示,类似于 1f ab 4e 83。我尝试了很多类似问题的答案(比特移位,静态播放等),但是如果我打印结果,我只能看到奇怪的符号而不是其中的4个。

char serial_no[4] = {
    t & 0x000000FF,
    (t & 0x00FF0000) >> 8,
    (t & 0x0000FF00) >> 16,
    (t & 0xFF000000) >> 24
};
FILE * pFile;
pFile = fopen("C:/hex.txt","w");
fprintf(pFile, &serial_no[0]);
fprintf(pFile, &serial_no[1]);
fprintf(pFile, &serial_no[2]);
fprintf(pFile, &serial_no[3]);
fclose(pFile);

我写的文件,当我用HexEdit打开它时,只显示了1个字节。至少我希望看到4个字节。

例如,我还需要写4个字符(4个字节):

//                          O     g     g     S
char capture_pattern[4] = {0x4f, 0x67, 0x67, 0x53};

这里控制台输出返回O g g S,或者当我在HexEdit中打开它时,4f 67 67 53正如预期的那样。 我希望相同,但首先是LSB的数字。

2 个答案:

答案 0 :(得分:1)

只是为了澄清:你想要将十六进制数字打印为ascii,对吗?例如,你想要

int = 0x012345ab;显示为0x01 0x23 0x45 0xab,对吧?

在这种情况下,您的fprintf语句不完整。你需要:

pFile = fopen("C:/hex.txt","w");
fprintf(pFile, "0x%02x ", (unsigned char)serial_no[0]);
fprintf(pFile, "0x%02x ", (unsigned char)serial_no[1]);
fprintf(pFile, "0x%02x ", (unsigned char)serial_no[2]);
fprintf(pFile, "0x%02x ", (unsigned char)serial_no[3]);
fclose(pFile);

你错过了第二个参数。看看function format

以下代码显示了完整示例以及完成您要执行的操作的另一种方法:

另外,请注意您的班次不正确。下面的代码修复了这个问题。

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

int main() {
    int t = 0x012345ab;

    char serial_no[4] = {
        t & 0x000000FF,
        (t & 0x0000FF00) >> 8,
        (t & 0x00FF0000) >> 16,
        (t & 0xFF000000) >> 24
    };

    printf("0x%02x ", (unsigned char)serial_no[0]);
    printf("0x%02x ", (unsigned char)serial_no[1]);
    printf("0x%02x ", (unsigned char)serial_no[2]);
    printf("0x%02x ", (unsigned char)serial_no[3]);
    printf("\n");

    int b = 0x012345cd;

    char arr[4] = {0};

    memcpy(arr, (unsigned char *)&b, sizeof(b));

    printf("0x%02x ", (unsigned char)arr[0]);
    printf("0x%02x ", (unsigned char)arr[1]);
    printf("0x%02x ", (unsigned char)arr[2]);
    printf("0x%02x ", (unsigned char)arr[3]);
    printf("\n");


    return 0;
}

输出:

  

$ Debug / test
  0xab 0x45 0x23 0x01
  0xcd 0x45 0x23 0x01

答案 1 :(得分:1)

计算serial_no需要修复和推荐的类型更改

unsigned char serial_no[4] = { t, t >> 8, t >> 16, t >> 24};

添加格式:

//%x for hex, 02 to print at least 2 digits, hh to cast to char
fprintf(pFile, "%02hhx", serial_no[0]);
fprintf(pFile, "%02hhx", serial_no[1]);
fprintf(pFile, "%02hhx", serial_no[2]);
fprintf(pFile, "%02hhx", serial_no[3]);

fprintf(pFile, "%02hhx%02hhx%02hhx%02hhx", t, t >> 8, t >> 16, t >> 24);

如果您的系统不理解hh,因为它是C99之前的

fprintf(pFile, "%02x%02x%02x%02x", (unsigned char) t, 
     (unsigned char) (t >> 8), (unsigned char) (t >> 16), (unsigned char) (t >> 24));