嵌入式:第二天(C语言入门)

目录

一、基础语法

位运算符:

& -(与运算)

| -(或运算)

^ -(异或运算)

~ -(取反运算)

<< -(左移运算符)

>> -(右移运算符)

 运算符示例代码:

运算符小案例:

运算符优先级

类型转换:

控制语句:

程序执行的三大流程:

分支语句:

if语句:

if..else语句:

if…else if…else语句:

switch语句

分支综合案例:

循环语句:

while循环语句:

do...while循环语句:

for循环语句:

死循环:

循环案例:


一、基础语法

位运算符:

常见的位运算符号有&、|、^、~、>>、<<,分别代表着如下含义:

运算符

术语

示例

结果

&

按位与运算

011 & 101

2个都为1才为1,结果为001

|

按位或运算

011 | 101

有1个为1就为1,结果为111

^

按位异或运算

011 ^ 101

不同的为1,结果为110

~

取反运算

~011

100

<<

左移运算

1010 << 1

10100

>>

右移运算

1010 >> 1

0101

 ps:取反、左右位移运算需要在补码的基础上运算。

& -(与运算)

按位与(&)运算:位与位进行比较,如果都为1,则为1,否则为0;

 // 1. 按位与运算  &
    /*
      5  二进制 101
      3  二进制 011
      -------------
                001
      按位与运算结论:两个数位置相同的都为1,则为1,否则为0;

       */
    printf("%d\n", 5 & 3); // 结果为1
| -(或运算)

按位或(|)运算:位与位进行比较,如果都为0,则为0,否则为1;

 // 2. 按位或运算  |
    /*
      5  二进制 101
      3  二进制 011
      -------------
                111
      按位或运算结论:两个数位置相同的有一个为1,则为1,否则为0;

       */
    printf("%d\n", 5 | 3); // 结果为7
^ -(异或运算)

按位异或运算:位与位进行比较,相同为0,不同为1;

  // 3. 按位异或运算  ^
  /*
5  二进制 101
3  二进制 011
-------------
          110
按位异或运算结论:两个数位置相同的数不相同,则为1,否则为0;

 */
  printf("%d\n", 5 ^ 3); // 结果为6
~ -(取反运算)

按位取反运算:补码取反,再将取反后的补码转为原码;

ps:无符号的数据,取反后最高位为1,也不需要逆运算。

 // 4. 取反运算  ~
  /*
  5  二进制 101
            010

            011

            110

  取反结论:取反,再将取反后的补码转为原码;
  注意:【使用的数据类型不一样得出的结果不一样】
  */
  printf("%d\n", ~5); // 结果为-6
<< -(左移运算符)

将数字的二进制补码全部向左移动,空出来的位置补0,超出范围的二进制数丢弃

有符号的数据左移后最高位如果为1,则需要进行逆运算;

注意事项:

  • 无符号的数据,左移后最高位为1,也不需要逆运算;
  • -128:1000 0000 特殊情况也不需要逆运算;
/**
     * 示例:
     *      40 << 4 = 0010 1000 << 4 = 1000 0000 = -128 (特殊的不需要逆运算)
     *      41 << 4 = 0010 1001 << 4 = 1001 0000 = 1000 1111 = 1111 0000 = -112
     *       7 6 5 4 3 2 1 0
     *       1 0 0 1 0 0 0 0
     */

    int8_t p = 40;
    p <<= 4;    //  p = p << 4;
    printf("40 << 4 = %d\n", p);
>> -(右移运算符)

将数字的二进制补码全部向右移动,空出来的位置补什么,取决于原来的最高位是什么。原来的最高是1就补1, 原来的最高位是0 就补0 。也可以转化成这样的一句话: 正数补0, 负数补1;

	
	/*
	  23: 0001 0111【原码】 ----  0001 0111【反码】 ----  0001 0111 【补码】
											  >> 2
	  -----------------------------------------------
										  0000 0101【补码】 --->  5
	 */
	printf(" 23 >> 2 = %d \n" , 23 >> 2) ; 
	
	
	/*
	  123: 1001 0111【原码】 ----  1110 1000【反码】----  1110 1001【补码】
											  >> 2
	  -----------------------------------------------
											1111 1010【补码】 --->  1111 1001【反码】- ----- 1000 0110 【原码】===> -6
	 */
	printf(" -23 >> 2 = %d \n" , -23 >> 2) ; 
 运算符示例代码:
#include <stdio.h>
#include <inttypes.h>

int main() {
    uint8_t a = 3;          // 0000 0011
    uint8_t b = 10;         // 0000 1010
    // 打印显示2个字符,个数不够,左边补0
    printf("%02x\n", a & b); // 0000 0010,16进制为02
    printf("%02x\n", a | b); // 0000 1011,16进制为0b
    printf("%02x\n", a ^ b); // 0000 1001,16进制为09

    uint8_t c = 10;          // 0000 1010
    uint8_t temp = ~c;       // 1111 0101
    printf("%02x\n", temp);   // 1111 0101,16进制为f5
    printf("%02x\n", c << 1); // 0001 0100,16进制为14
    printf("%02x\n", c >> 1); // 0000 0101,16进制为05

    return 0;
}
运算符小案例:
#include <stdio.h>
#include <inttypes.h>
int main()
{
    /*
    置1:
      用按位或运算(|)或者左移(<<)
      按位或运算结论:两个数有一个为1 则为1
       */

    // 1. 将变量a的第2位设置为1,其他位保持不变
    // 使用或运算,两个数有一个为1 则为1
    // 0b10110011    0xb3
    // 0b00000100    0x4
    // 0b10110111    0xb7
    uint8_t a = 0b10110011;

    printf("结果为:%#x\n", a | 0x4);
    // printf("%d\n", (1 << 2)); // 4  二进制 100  0b00000100
    printf("结果为:%#x\n", a | (1 << 2));

    // 2. 将变量b的第2位、第6位设置为1,其他位保持不变
    // 使用或运算,两个数有一个为1 则为1
    // 0b10110011    0xb3
    // 0b01000100    0x44
    // 0b11110111    0xf7
    uint8_t b = 0b10110011;
    printf("结果为:%#x\n", b | 0x44);

    // 根据这个0b01000100所知  先左移两位 再左移六位
    // printf("%d\n", (1 << 2)); // 4  二进制 100  0b00000100
    // printf("%d\n", (1 << 6)); // 64  二进制 1000000  0b01000000

    // 以上两个结合 就是0b01000100
    printf("%#x\n", b | (1 << 2 | 1 << 6));

    /*
    置0:
    按位与运算(&)或者左移取反(~<<)
    按位与运算结论:两个数位置相同的都为1,则为1,否则为0;
     */
    // 3. 将变量c的第5位设置为0,其他位保持不变
    uint8_t c = 0b10110011;
    // 0b10110011    0xb3
    // 0b11011111    0xdf
    // 0b10010011    0x93
    printf("%#x\n", c & 0b11011111);
    printf("结果为:%#x\n", c & 0xdf);
    printf("%d\n", ~(1 << 5));
    printf("%#x\n", c & ~(1 << 5));

    // 4. 将变量d的第0~3位设置为0,其他位保持不变
    /* 区间:
       就用 左移+ 按位(|)运算并取反(~) */
    uint8_t d = 0xff; // 0xff;
    // 1111 1111   // 0xff
    // 1111 0000   // 0xf0
    // 1111 0000   // 0xf0
    printf("%#x\n", d & 0xf0);
    printf("%#x\n", d & ~(1 << 0 | 1 << 1 | 1 << 2 | 1 << 3));

    // 5. 将变量e的第2位取反,其他位保持不变
    uint8_t e = 0b10110011; // 0xb3;
    // 0b10110011   0xb3
    // 0b00000100   0x4
    // 0b10110111   0xb7
    printf("%#x\n", e ^ 0b00000100);
    printf("%#x\n", e ^ 0x4);
    printf("%#x\n", e ^ (1 << 2));

    // 6. 将变量f取出8-15位
    uint32_t f = 0x12345678;
    // 变量f为十六进制 代表一个32位的二进制  1对4  4*8=32
    // 0000 0000 0000 0000 0000 0000 0000 0000    代表0x12345678
    // 0000 0000 0000 0000 1111 1111 0000 0000    代表想要取出的位数
    // 在十六进制中 1111对应f
    // 0000 0000 0000 0000 f f 0000 0000
    printf("%#x\n", (f & 0x0000ff00) >> 8);

    return 0;
}
运算符优先级
  • 不同的运算符默认具备不同的优先级,符号较多不用记,现用现查就可以。
  • 当无法确定谁的优先级高时,加一个小括号就解决了。

类型转换:

数据有不同的类型,不同类型数据之间进行混合运算时涉及到类型的转换问题。

  • 转换的方法有两种:
    • 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成
    • 强制类型转换:把表达式的运算结果强制转换成所需的数据类型
      • 语法格式: (类型)变量或常量
  • 类型转换的原则:
    • 占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。
#include <stdio.h>

int main()
{
    // 类型转换的原则:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。

    char a = 129;

    printf("%d\n", a);   // 隐式转换

    int b = 129;

    char c = (char)b;   // 强制转换

    printf("%d\n", c);

    return 0;
}

控制语句:

程序执行的三大流程:
  • 顺序 : 从上向下, 顺序执行代码
  • 分支 : 根据条件判断, 决定执行代码的分支
  • 循环 : 让特定代码重复的执行

分支语句:

条件语句用来根据不同的条件来执行不同的语句,C语言中常用的条件语句包括if语句和switch语句。

if语句:

语法格式:

if (条件) {
    条件成立时,要做的事
    ……
}

案例: 

#include <stdio.h>

int main() {
    //  根据条件 去执行某些代码
    int salary = 181818;
    if (salary > 100000)
    {
        printf("买保时捷");
        /* code */
    }

    return 0;
}
if..else语句:

基础语法:

语法格式:

if (条件) {
    条件成立时,要做的事
    ……
} else {
	条件不成立时,要做的事 
    ……
}

案例:

#include <stdio.h>

int main() {
    //  if 条件不成立  执行else 代码
    int salary = 888888;
    if (salary > 3000) {
        printf("买保时捷\n");
    }
    else
    {
        printf("回家睡觉\n");
    }


    return 0;
}

三元运算符:

运算符

术语

示例

结果

?:

三目运算符

a>b?a:b;

如果a>b,整体为结果a,否则整体结果为b

语法格式:

条件表达式?条件成立:条件不成立

案例:

#include <stdio.h>

int main() {
    // 通过三目运算符求2个数的最大值
    int a = 10;
    int b = 20;
    int c = a > b ? a : b;
    printf("最大值:%d\n", c);

    return 0;
}
if…else if…else语句:

语法格式:

if (条件1) {
    条件1成立时,要做的事
    ……
} else if(条件2) {
	条件2成立时,要做的事 
    ……
} else {
	条件不成立时,要做的事 
    ……
}

案例:

#include <stdio.h>

int main()
{
    // 3. 从屏幕上输入一个学生的成绩(0 - 100),对学生成绩进行评定:
    //     < 60为E
    //     60~69为D
    //     70~79为C
    //     80~89为B
    //     90以上为A
    //     < 0或>100提示成绩输入出错

    // 1. 定义变量接收学校输入的成绩
    int score;
    printf("请输入学生的成绩!\n");
    scanf("%d", &score);
    if (score < 60)
    {
        printf("E\n");
    }
    else if (score >= 90 && score <= 100)
    {
        printf("A\n");
    }
    else if (score >= 80 && score < 90)
    {
        printf("B\n");
    }
    else if (score >= 70 && score < 80)
    {
        printf("C\n");
    }

    else if (score >= 60 && score < 70)
    {
        printf("D\n");
    }
    else if (score < 0 || score > 100)
    {
        printf("成绩输入出错\n");
    }

    return 0;
}
switch语句
  • 测试一个表达式是否等于一些可能的值,并根据表达式的值执行相应的代码块,可以使用switch语言实现
  • switch可以支持数据类型:
    • int
    • 枚举类型
    • char类型
  • switch和if区别:
    • 需要根据布尔条件来执行不同的代码块,则应使用if语句
    • 需要根据表达式的值来执行不同的代码块,则应使用switch语句

语法格式:

switch (expression) {
    case value1:
        // 代码块1
        break;
    case value2:
        // 代码块2
        break;
    default:
    	// 代码块3
}
    

案例:

#include <stdio.h>

int main() {
    //    ○ 输入1:输出Monday
    //   ○ 输入2:输出Tuesday
    //   ○ 输入3:输出Wednesday
    //   ○ 输入4:输出Thursday
    //   ○ 输入5:输出Friday
    //   ○ 输入6:输出Saturday
    //   ○ 输入7:输出Sunday
    //   ○ 输入其它:输出error
    printf("请输入对应的数字1-7:");
    int num;
    scanf("%d", &num);
    switch (num)
    {
    case 1:
        printf("Monday\n");
        break;
    case 2:
        printf("Tuesday\n");
        break;
    case 3:
        printf("Wednesday\n");
        break;
    case 4:
        printf("Thursday\n");
        break;
    case 5:
        printf("Friday\n");
        break;
    case 6:
        printf("Saturday\n");
        break;
    case 7:
        printf("Sunday\n");
        break;

    default:
        break;
    }

    return 0;
}
分支综合案例:
#include <stdio.h>
// 1.定义变量保存年份、月份、天数
// 2.输入年份和月份
// 3.根据月份输出天数
// 	1、3、5、7、8、10、12月  31天
//     4、6、9、11月			30天
//     2月 	非闰年 28天  闰年 29天
// 	闰年判断:能被4整除,但不能被100整除的;或者能被400整除的年份

int main() {
    int  year, month, day;
    printf("请输入年月");
    scanf("%d %d", &year, &month);
    switch (month)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        day = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        day = 30;
        break;
    case 2:
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            day = 29;
        }
        else {
            day = 28;
        }

    default:
        break;
    }
    printf("年=%d 月= %d 天数=%d\n", year, month, day);

    return 0;
}

循环语句:

  • 什么是循环
    • 重复执行代码
  • 为什么需要循环

  • 循环的实现方式
    • while
    • do...while
    • for
while循环语句:

语法格式:

while (条件) {
    循环体
    ……
}

案例:

#include <stdio.h>

int main() {
    // 需求跑步5圈
    // 1. 条件变量的定义
    int i = 1;
    // 2. while 控制重复的次数
    while (i <= 5) {
        // 3. 打印跑步第几圈
        printf("跑步第 %d 圈\n", i);
        // 4. 条件改变
        i++;
    }

    return 0;
}
do...while循环语句:

语法格式:

do {
    循环体
    ……
} while (条件);
  • do-while 循环语句是在执行循环体之后才检查 条件 表达式的值
  • 所以 do-while 语句的循环体至少执行一次,do…while也被称为直到型循环

案例:

#include <stdio.h>

int main() {
    // 需求跑步5圈
    // 1. 条件变量的定义
    int i = 1;
    do {
        // 2.1 打印跑步第几圈
        printf("跑步第 %d 圈\n", i);
        // 2.2 条件改变
        i++;
    } while ( i <= 5 ); // 3. 控制重复的次数

    return 0;
}
for循环语句:

语法格式:

for ( init; condition; increment ) {
	循环体
}
  • init会首先被执行,且只会执行一次
  • 接下来,会判断 condition,如果条件condition为真
  • 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句
  • 条件再次被判断

案例:

#include <stdio.h>

int main() {
    // 需求跑步5圈
    for (int i = 1; i <= 5; i++) {
        printf("跑步第 %d 圈\n", i);
    }

    return 0;
}
死循环:
  • 条件永远为真的循环就是死循环

示例代码:

#include <stdio.h>

int main() {
    // while (1) {
    //     printf("根本停不下来\n");
    // }

    for(;;) {
        printf("根本停不下来\n");
    }

    return 0;
}
循环案例:

1. 实现1+2+3……100所有数字的累加

案例:

#include <stdio.h>

int main() {
    // 需求:实现1+2+3……100所有数字的累加
    // 定义条件变量初始值为1
    int i = 1;
    // 定义累加变量,初始值为0
    int sum = 0;
    // 循环控制100次
    while (i <= 100) {
        // 累加
        sum += i;
        // 条件改变
        i++;
    }
    // 循环外面,打印最终的累加和
    printf("sum = %d\n", sum);

    // for循环实现
    int temp = 0;
    for (int i = 1; i <= 100; i++) {
        temp += i;
    }
    printf("temp = %d\n", temp);

    return 0;
}

2. 循环嵌套

需求如下:

通过for循环嵌套打印内容:
* * * * * 
* * * * * 
* * * * * 
* * * * * 
* * * * * 
说明:
1)每行有5个*,总共有5行
2)*之间有空格隔开
3)printf()1次只能打印1个*

代码实现:

#include <stdio.h>

int main() {
    for (int i = 0; i <= 4; i++) {
        for (int j = 0; j <= 4; j++) {
            printf("* ");
        }
        printf("\n");
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/539056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

稀碎从零算法笔记Day47-LeetCode:找到冠军 I

或许是昨天的每日一题太难了&#xff0c;今天的简单 题型&#xff1a;数组、矩阵 链接&#xff1a;2923. 找到冠军 I - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 一场比赛中共有 n 支队伍&#xff0c;按从 0 到 n - 1 编号。 给你一个下…

深入理解Apache ZooKeeper与Kafka的协同工作原理

目录 引言 一、ZooKeeper基础概念 &#xff08;一&#xff09;ZooKeeper简介 &#xff08;二&#xff09;ZooKeeper数据结构 &#xff08;三&#xff09;ZooKeeper特点 &#xff08;四&#xff09;应用场景 二、ZooKeeper工作模式 &#xff08;一&#xff09;工作机制 …

未来汽车硬件安全的需求(2)

目录 4.汽车安全控制器 4.1 TPM2.0 4.2 安全控制器的硬件保护措施 5. EVITA HSM和安全控制器结合 6.小结 4.汽车安全控制器 汽车安全控制器是用于汽车工业安全关键应用的微控制器。 他们的保护水平远远高于EVITA HSM。今天的典型应用是移动通信&#xff0c;V2X、SOTA、…

享元模式:优化资源利用的高效策略

在面向对象的软件开发中&#xff0c;享元模式是一种结构型设计模式&#xff0c;旨在减少内存使用&#xff0c;通过共享尽可能多的相似对象来提高应用程序的效率。本文将详细介绍享元模式的定义、实现、应用场景以及优缺点。 1. 享元模式的定义 享元模式&#xff08;Flyweigh…

【性能测试】接口测试各知识第3篇:Jmeter 基本使用流程,学习目标【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

2024年公共管理、健康与大数据国际学术会议(ICPAHBD 2024)

2024 International Conference on Public Administration, Health and Big Data (ICPAHBD 2024) ●会议简介 2024年公共管理、健康与大数据国际学术会议&#xff08;ICPAHBD 2024&#xff09;即将在宁波盛大召开。本次会议旨在汇聚全球公共管理、健康与大数据领域的专家学者…

【示例】MySQL-MySQL中常见的锁

前言 本文主要讲述MySQL中常见的锁。 总结 | 各类别锁的名字 锁级别锁名字解释全局锁read lock全局锁只有可读锁表级锁 - 表锁read lock 表共享读锁write lock 表独占写锁表级锁 - 元数据锁&#xff08;meta data lock&#xff0c;MDL&#xff09;SHARED_READ_ONLYSHARED_NO…

浏览器工作原理与实践--HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络

前面两篇文章我们分析了HTTP/1和HTTP/2&#xff0c;在HTTP/2出现之前&#xff0c;开发者需要采取很多变通的方式来解决HTTP/1所存在的问题&#xff0c;不过HTTP/2在2018年就开始得到了大规模的应用&#xff0c;HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是使…

MySQL 修改数据

目录 数据插入-insert 不指定列名插入&#xff1a; 插入整行数据 格式&#xff1a; 多行数据插入 格式&#xff1a; 指定列名插入 插入1行 插入多行 更新字段-update 语法&#xff1a; 删除表 语法&#xff1a; 案例&#xff1a; 数据插入-insert INSERT 将数据行…

从IoTDB的发展回顾时序数据库演进史

面向工业物联网时代&#xff0c;以 IoTDB 为代表的时序数据库加速发展。 时序数据的主要产生来源之一是设备与传感器&#xff0c;具有监测点多、采样频率高、存储数据量大等多类不同于其他数据类型的特性&#xff0c;从而导致数据库在实现高通量写入、存储成本、实时查询等多个…

AI电影创作,AI影视创作全套完整课程

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89064240 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 【试听课】AI发展的现状及对影视行业未来的影响.mp4 0【AI影视创作】流程与基本逻辑_1.mp4 1【AI基础课程】ChatGPT 注册安装流程.…

LinkedList部分底层源码分析

JDK版本为1.8.0_271&#xff0c;以插入和删除元素为例&#xff0c;LinkedList部分源码如下&#xff1a; //属性&#xff0c;底层结构为双向链表 transient Node<E> first; //记录第一个结点的位置 transient Node<E> last; //记录最后一个结点的尾元素 transient …

半透明进口特氟龙材质镊子可耐受强酸强碱腐蚀PFA镊子

PFA镊子用于夹取小型片状、薄状、块状样品&#xff0c;广泛应用在半导体、新材料、新能源、原子能、石油化工、无线电、电力机械等行业。 具有耐高低温性&#xff08;可使用温度-200℃&#xff5e;&#xff0b;260℃&#xff09;、耐腐蚀、表面不粘性等特点&#xff0c;用于苛…

python--字符串对象和

1、找出10000以内能被5或6整除&#xff0c;但不能被两者同时整除的数&#xff08;函数&#xff09; def Divisible_by_5_6(x:int)->list:arr[]for i in range(1,x1):if (i % 5 0 or i % 6 0 ):if i % 5 0 and i % 6 0:continue #利用continue跳过能被5和6整除的数else:a…

跟bug较劲的第n天,undefined === undefined

前情提要 场景复现 看到这张图片&#xff0c;有的同学也许不知道这个冷知识&#xff0c;分享一下&#xff0c;是因为我在开发过程中踩到的坑&#xff0c;花了三小时排查出问题的原因在这&#xff0c;你们说值不值。。。 我分享下我是怎么碰到的这个问题&#xff0c;下面看代码…

服务器安装完SqlServer远程电脑连接不了

1、将服务器的TCP/IP启用 2、重新启动服务 cmd输入services.msc

【数据结构与算法篇】双链表实现

【数据结构与算法篇】双链表实现&#xff08;近300行实现代码&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. List.h 头文件的声明 2. List.c 源文…

Python通过socket搭建一个web服务器

目录 01、源码 02、运行结果 03、小结 Socket是一种计算机网络通信的一种机制&#xff0c;它允许不同计算机或进程之间通过网络进行数据传输和通信。Socket可以被看作是不同计算机之间的数据传输通道&#xff0c;通过这个通道&#xff0c;计算机之间可以进行双向的数据传输。…

在线药房数据惨遭Ransomhub窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件119起&#xff0c;与上周相比勒索事件有所增长。 本周Blacksuit是影响最严重的勒索家族&#xff0c;Ransomhub和Blackbasta恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。…

二百三十二、Kettle——修改MySQL中历史数据为当前系统日期并增量同步到ClickHouse中

一、目的 由于一些雷达死了但是又需要有数据进行展示&#xff0c;于是就把这些雷达的历史数据&#xff0c;修改日期为当前日期后&#xff0c;增量同步到ClickHouse中&#xff0c; 二、难点 1、获取当前日期&#xff0c;并且修改历史数据的create_time字段的日期部分 2、如果…