我是c编程的新手。作为我的网络安全单一课程的一部分,我必须设计一个SSL握手模拟。我在网上找到了一个示例代码,但是我不了解代码的某些部分。你可以帮我跟进一下:
(char) 0
做什么? (send_data定义为char send_data[1024];
)
send_data[0] = (char) 0; //Packet Type = hello
send_data[1] = (char) 3; //Version
编辑+关注
我知道什么类型的铸件。
我理解什么是演员但是我发布的代码什么也没做。即使整数0被转换为一个字符,它也没有做任何事情,因为当你打印它时 - 它是空白的 - 没有价值。
例如:
#include <stdio.h>
#include <stdlib.h>
int main(){
char test;
int num;
num = 1;
test = (char) num; // this does nothing
printf("num = %d , %c\n",num,num);
printf("test = %d , %c\n",test,test);
// Isn't this the correct way to do it ?? :
num = 3;
test = '3'; // now this is a character 3
printf("num = %d , %c\n",num,num);
printf("test = %d , %c\n",test,test);
return 0;
}
上述代码的输出是:
num = 1 ,
test = 1 ,
num = 3 ,
test = 51 , 3
为什么要这样做?这不是正确的方法: - send_data [0] ='0'; send_data [1] ='3';
答案 0 :(得分:6)
它只是将int
0(或3)转换为char
类型。
可能没有必要,但可以用来删除可能截断的警告。
更好的习语是:
send_data[0] = '\x00'; // Packet Type = hello
send_data[1] = '\x03'; // Version
因为这些是明确的字符,而不必担心投射。
请注意,(char) 0
(或'\x00'
)不与'0'
相同。前两个为您提供字符代码0(ASCII中的NUL
字符),后者为您提供可打印 0
字符的字符代码(字符代码48或{ ASCII中的{1}}。 那是为什么你的印刷没有像你期望的那样发挥作用。
您的特定协议是否需要代码点0或可打印字符0是您尚未明确的事情。如果您真的想要模拟SSLv3,那么正确的值是二进制而不是可打印的值RFC6101:
'\x30'
答案 1 :(得分:1)
它只是将文字符号转换为char值。但我认为没有必要。
答案 2 :(得分:0)
int
类型的char
值为casting。
答案 3 :(得分:0)
这称为type-conversion
或casting
。当您需要将一种数据类型的实体更改为另一种数据类型时,可以执行此操作。
在您的示例中,0和3(整数)被转换为类型字符。
答案 4 :(得分:0)
send_data
被定义为char
的数组。但0
和3
是整数文字。将整数分配给数组时,它们将被转换为char
。这意味着send_data [0]
将保留ASCII值为0的字符,即NUL
字符。 send_data[1]
将保留ASCII值为3的字符end of text
字符。
答案 5 :(得分:0)
int main()
{
char ch;
ch = (char) 0;
printf("%d\n", ch); //This will print 0
printf("%c\n", ch); //This will print nothing (character whose value is 0 which is NUL)
ch = (char) 3;
printf("%d\n", ch); //This will print 3
printf("%c\n", ch); //This will print a character whose value is 3
return 0;
}
对于char类型,它是类型转换int类型。
Its good to create a demo program and test it when you get some doubts while reading.