对于流的头文件,我需要写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的数字。
答案 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));