我从套接字收到一些数据 之后,我想在接收的char数组中打印一个字节。
以下是我使用的代码:
char buf[100];
int i = 0;
while (1)
{
rc = recv(socket_fd, buf, sizeof(buf), 0);
if (rc > 0)
{
printf("Pos1 = %x.\n", (char)buf[17]);
printf("Pos2 = %x.\n", (char)buf[22]);
}
}
但这打印出4个字节。如果我将字符强制转换为 unsigned char ,则会打印单个字节。那么这两个类型转换之间的区别是什么,这会导致打印不同的字节数。
输出:
Pos1 = 1
Pos2 = ffffff83
答案 0 :(得分:1)
如果您只想打印2个半字节,请使用:
@Component({
templateUrl: "PATH HERE"
})
在某些系统上,printf("Pos1 = %02x.\n", (unsigned)(unsigned char)buf[17]);
/* ^^ */
/* Print 2 nibbles with 0 prefix if required */
可能表现为char
,您会看到signed char
前置显示负数。因此,您必须在此类系统上投放ff
到buf[i]
。第二个unsigned用于匹配带有说明符unsigned char
答案 1 :(得分:1)
如果你在C stdio lib上找到printf
的参考文献指定符'x'打印无符号十六进制整数。
首先,print函数将期望一个整数值。
在您的示例中,您将转换为已签名的字符。
似乎正在进行的是,当您将变量转换为带符号的char时,如果该值超过127(0X7F),则设置的有符号位将扩展为4字节整数实体。另一方面,如果值为正(0到127),则输出(尽管在技术上是无符号的int值)将与unsigned char cast相同。
例如,如果您强制转换为Char,则128(0x80)将显示为FFFFFF80 施放为无符号字符时为80.
另一方面的127将显示为7F并且有任何一个演员。
因此,在使用printf时,您要打印的变量类型应与说明符类型匹配。
答案 2 :(得分:1)
那么这两个类型转换之间有什么区别,导致不同的字节数?
传递给函数printf
的每个输入参数在被推入堆栈之前被“扩展”为4或8个字节(取决于其类型)。
当您传递类型为signed
的输入参数时,符号位将被“保留”。
例如,signed char 0x89
已扩展为signed int 0xFFFFFF89
。
unsigned char 0x89
扩展为unsigned int 0x00000089
。
请注意,上面的答案取决于平台。
我认为在你的平台上:
CHAR_BIT
是8 sizeof int
是4 sizeof double
是8 关于printf
输入参数的AFAIK:
int
的整数参数扩展为int
double
的非整数参数扩展为double
答案 3 :(得分:0)
告诉printf
您通过
unsigned int
的一半的一半
printf("Pos1 = %hhx.\n", (unsigned char) buf[17]);