说我要打印unsigned char
:
unsigned char x = 12;
Run Code Online (Sandbox Code Playgroud)
哪个是对的.这个:
printf("%d",x);
Run Code Online (Sandbox Code Playgroud)
或这个:
printf("%u",x);
Run Code Online (Sandbox Code Playgroud)
?
事情就在其他地方我遇到过这样的讨论:
- 即使ch更改为unsigned char,代码的行为也不是由C标准定义的.这是因为unsigned char被提升为int(在普通的C实现中),因此将int传递给printf以获取指定符%u.但是,%u期望unsigned int,因此类型不匹配,并且C标准不定义行为
- 你的评论不正确.C11标准规定转换说明符必须与函数参数本身的类型相同,而不是提升类型.hh length修饰符的描述中也明确说明了这一点:"参数将根据整数提升进行提升,但其值应在打印前转换为signed char或unsigned char"
哪个是正确的?任何可靠的消息来源都说这个问题?(从这个意义上说,我们也应该unsigned short
用%d 打印int,因为它可以被提升为int
?).
请考虑以下简化代码.我想从文件中提取一些二进制数据/流,并以十六进制格式将其打印到标准输出.
我有额外的3个字节0xFFFFFF
.怎么了?额外的字节来自哪里?
产量
in:
2000FFFFFFAF00690033005A00
out:
2000FFFFFFAF00690033005A00
Run Code Online (Sandbox Code Playgroud)
program.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int i;
char raw[10] = {0x20,0x00,0xAF,0x00,0x69,0x00,0x33,0x00,0x5A,0x00};
FILE *outfile;
char *buf;
printf("in:\n\t");
for( i=0; i<10; i++ )
printf("%02X", raw[i]);
outfile = fopen("raw_data.bin", "w+b");
fwrite(raw, 1, 10, outfile);
buf = (char *) malloc (32 * sizeof(char));
fseek(outfile, 0, SEEK_SET);
fread(buf, 1, 10, outfile);
printf("\nout:\n\t");
for( i=0; i<10; i++ )
printf("%02X", buf[i]);
printf("\n");
fclose(outfile);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个这样的数组:
unsigned char array[] = {'\xc0', '\x3f', '\x0e', '\x54', '\xe5', '\x20'};
unsigned char array2[6];
Run Code Online (Sandbox Code Playgroud)
当我使用memcpy时:
memcpy(array2, array, 6);
Run Code Online (Sandbox Code Playgroud)
并打印它们:
printf("%x %x %x %x %x %x", array[0], // ... etc
printf("%x %x %x %x %x %x", array2[0], // ... etc
Run Code Online (Sandbox Code Playgroud)
一个打印像:
c0 3f e 54 e5 20
Run Code Online (Sandbox Code Playgroud)
但另一个打印
ffffffc0 3f e 54 ffffffe5 20
Run Code Online (Sandbox Code Playgroud)
发生了什么?
在示例c ++代码中,我将打开一个文件并打印六进制文件中的每个字符只有16个字符,但为什么ffffff会在每个heax值后打印?
char buff[256];
// buff filled with fread
for(i=0;i<16;i++)
printf("%x",buff[i]);
Run Code Online (Sandbox Code Playgroud)
输出是:
4affffff67ffffffcdffffff
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我想以十六进制格式打印字符串,
在机器A上,类似于
ori_mesg = gen_rdm_bytestream (1400,seed)
sendto(machine B, ori_mesg, len(mesg))
Run Code Online (Sandbox Code Playgroud)
在机器B上
recvfrom(machine A, mesg)
mesg_check = gen_rdm_bytestream (1400, seed)
for(i=0;i<20;i++){
printf("%02x ", *(mesg+i)& 0xFF);
}
printf("\n");
for(i=0;i<20;i++){
printf("%02x ", *(mesg_check+i));
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)
seed
在1,2,3之间变化....
字节生成函数是:
u_char *gen_rdm_bytestream (size_t num_bytes, unsigned int seed)
{
u_char *stream = malloc (num_bytes+4);
size_t i;
u_int16_t seq = seed;
seq = htons(seq);
u_int16_t tail = num_bytes;
tail = htons(tail);
memcpy(stream, &seq, sizeof(seq));
srand(seed);
for (i = 3; i < num_bytes+2; i++){
stream[i] = rand (); …
Run Code Online (Sandbox Code Playgroud) 从:
man strchr
Run Code Online (Sandbox Code Playgroud)
char*strchr(const char*s,int c);
strchr()函数返回指向字符串s中第一次出现的字符c的指针.
这里"字符"表示"字节"; 这些函数不适用于宽字符或多字节字符.
如果我尝试搜索多字节字符é
(0xC3A9
在UTF-8中):
const char str[] = "This string contains é which is a multi-byte character";
char * pos = strchr(str, (int)'é');
printf("%s\n", pos);
printf("0x%X 0x%X\n", pos[-1], pos[0]);
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
这是一个多字节字符
0xFFFFFFC3 0xFFFFFFA9
尽管有警告:
警告:多字符字符常量[-Wmultichar]
所以这是我的问题:
strchr
用于多字节字符?(它似乎工作,只要int
类型足够大,包含你的多字节,最多4个字节)0xFFFFFF
?所以我正在编写一个非常小而简单的程序,它将一个数字作为输入,将其转换为十六进制,然后一次打印出两个字符。
对于某些数字,它会在输出前打印出 ffffff。
这是我的代码:
//Convert the input to an unsigned int
unsigned int a = strtoul (argv[1], NULL, 0);
//Convert the unsigned int to a char pointer
char* c = (char*) &a;
//Print out the char two at a time
for(int i = 0; i < 4; i++){
printf("%02x ", c[i]);
}
Run Code Online (Sandbox Code Playgroud)
大多数输出都很好,看起来像这样:
./hex_int 1
01 00 00 00
Run Code Online (Sandbox Code Playgroud)
但是对于某些数字,输出如下所示:
./hex_int 100000
ffffffa0 ffffff86 01 00
Run Code Online (Sandbox Code Playgroud)
如果您删除所有 f,则转换是正确的,但我无法弄清楚为什么它仅在某些输入上执行此操作。
谁有想法?