为什么传输字符时必须减去'0'?
时间: 2023-05-31 19:02:19 浏览: 26
传输字符时必须减去'0'的原因是因为计算机内部存储数字是以二进制形式存储的,而字符'0'的ASCII码是48,即0的ASCII码加上48,因此在传输时需要将字符'0'转换为数字0,即减去'0'的ASCII码值,才能正确地将字符转换为数字进行计算。
相关问题
用c语言编写这段加密算法选择一个密钥K,该密钥包括一个整数和一个字符串,例如:K=(5, "Hello")。 将待加密的明文M转换为ascii码,并将每个ascii码值加上密钥整数部分K[0],得到新的ascii码值N。 将加密的结果再转换为字符串,将密钥字符串K[1]插入其中,得到加密后的密文C。 解密时,将密文C中的密钥字符串K[1]取出,然后将每个ascii码值减去密钥整数部分K[0],得到原始的ascii码值,最后将ascii码转换为明文即可。
好的,这是一个简单的加密算法。有了这个算法,我们就可以实现加密和解密操作了。以下是C语言实现代码示例:
```c
#include <stdio.h>
#include <string.h>
void encrypt(char *msg, int key, char *result) {
int len = strlen(msg);
for (int i = 0; i < len; i++) {
result[i] = msg[i] + key;
}
result[len] = '\0';
strcat(result, ", ");
strcat(result, "Hello");
}
void decrypt(char *msg, int key, char *result) {
int len = strlen(msg) - strlen(", Hello");
for (int i = 0; i < len; i++) {
result[i] = msg[i] - key;
}
result[len] = '\0';
}
int main() {
char msg[] = "Hello, world!";
int key = 5;
char encrypted_msg[100];
char decrypted_msg[100];
encrypt(msg, key, encrypted_msg);
printf("Encrypted message: %s\n", encrypted_msg);
decrypt(&encrypted_msg[0], key, decrypted_msg);
printf("Decrypted message: %s\n", decrypted_msg);
return 0;
}
```
在这个示例中,我们定义了两个函数encrypt和decrypt,分别用于加密和解密消息。encrypt函数将消息转换为ascii码,并用密钥整数部分加密。然后将密钥字符串插入其中,得到加密后的密文。decrypt函数将密文中的密钥字符串取出,并将每个ascii码值减去密钥整数部分,得到原始的ascii码值,最后将ascii码转换为明文即可。
在main函数中,我们定义了一个消息和一个密钥,然后使用encrypt函数加密消息,并使用decrypt函数解密消息。最终输出加密和解密后的消息。
注意:这个加密算法并不是非常安全,因为密钥是明文传输的,并且加密操作也比较简单。如果需要更安全的加密算法,可以使用现有的加密库或自己设计更复杂的加密算法。
那字符怎样转化成像素数据
将字符转换成像素数据的过程称为字符的映射,一般采用的方法是字库映射。字库是将每个字符对应的像素点数据事先存储在一个字库表中,当需要显示某个字符时,程序会根据字库表中相应字符的像素点数据进行像素点的填充,从而实现字符的显示。
下面是一个基于ASCII码的字库映射示例:
```c
#define FONT_WIDTH 8 //字体宽度
#define FONT_HEIGHT 16 //字体高度
//ASCII码字体库,每个字符占用16个字节
const unsigned char FONT_ASCII[][16] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //空格
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00}, //!
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00}, //"
{0x00, 0x00, 0x00, 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //#
//...其它字符
};
//字符映射函数,将ASCII码转换成像素点数据
void Char_Map(unsigned char* ch, unsigned char* map)
{
int i,j,k;
for(i=0; i<FONT_HEIGHT; i++)
{
for(j=0; j<FONT_WIDTH; j++)
{
k = (ch[0]-' ')*FONT_WIDTH+i*2+j/8;
if(FONT_ASCII[k][j%8] & (0x80>>(j%8))) //判断像素点是否填充
map[i*FONT_WIDTH+j] = 1;
else
map[i*FONT_WIDTH+j] = 0;
}
}
}
```
上述程序中,定义了一个字库表`FONT_ASCII`,存储了ASCII码字符对应的像素点数据。`Char_Map()`函数将要显示的字符转换成像素点数据,存储在`map`数组中。具体实现过程是,先将字符`ch`对应的ASC码减去空格字符的ASC码,得到在字库表中的下标k,然后按照像素点的顺序将字库表中对应的像素点数据填充到`map`数组中。字符映射后,就可以将像素点数据传输到OLED屏幕上,显示出相应的字符了。