- 博客(55)
- 收藏
- 关注
原创 TCP/IP协议格式(以太网头,IP头,TCP头)以及TCP三次握手/四次挥手
一个网络报文的结构大概如下: 太网报头长度为14个字节。主要包括:目的地址占6个字节,源地址6个字节,类型2个字节。 以太网传输中的冲突和帧大小关系以太网帧大小必须在64-1518字节(不包含前导码和定界符),即包括目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)在内,其中数据段大小在46~1500字节之间。以太网由前导码(7B)、定界符(1B)、目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)。 前导码(preamble):交替的0和1,设备从静默状态变成有信号状
2025-03-22 21:56:46
794
原创 网络编程知识预备阶段
OSI(Open System Interconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能,从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时,更好地理解和管理网络通信的过程。OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。特点:1.每一层实现不同的功能,对上层的数据做透明传输。2.每一层向上层提供服务,同时使用下层提供的服务。
2025-03-17 20:53:57
589
原创 CAN详解
CAN电平标准CAN简介•CAN总线()控制器局域网总线•CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域•CAN总线特征:1、两根通信线(CAN_HCAN_L),线路少。2、差分信号通信,抗干扰能力强。3、高速CANISO11898):4、低速CANISO11519):5、异步,无需时钟线,通信速率由设备各自约定。
2024-11-28 22:24:12
1417
原创 【AUTOSAR标准文档】IO Hardware Abstraction 摘录
译文:I/O硬件抽象提供的ECU信号(示例)此序列图解释了第7.5.2.5章中的示例。在此示例中,传感器/执行器组件是客户端,I/O硬件抽象是服务器。传感器/执行器组件请求获取af_pressure AUTOSAR信号的新值,该信号在I/O硬件抽象层级别上是一个ECU信号。ADC(模数转换器)转换完成后,来自MCAL(微控制器抽象层)驱动程序的通知会被转换为传感器/执行器组件的RTE(运行时环境)事件。然后,传感器/执行器组件可以同步读取af_pressure信号缓冲区中存储的值。
2024-10-21 22:36:01
1104
原创 【AUTOSAR标准文档】服务类型介绍
② Memory③Crypto⑥ SystemAUTOSAR标准文档中的内容可以翻译为以下中文表述:基础软件可以细分为以下类型的服务:① 输入/输出(I/O)对传感器、执行器和ECU(电子控制单元)车载外设的标准化访问② 内存对内部/外部内存(非易失性内存)的标准化访问③ 密码学(Crypto)对包括内部/外部硬件加速器在内的密码学原语的标准化访问④ 通信对以下内容的标准化访问:车辆网络系统、ECU车载通信系统和ECU内部软件⑤ 车外通信(Off-board)
2024-10-20 00:08:02
1062
原创 【AUTOSAR标准文档】AotuSar结构横向分层详解(RTE、BSW)
TheTaskProperties微控制器抽象层是基础软件的最低层。它包含内部驱动程序,这些驱动程序是能够直接访问微控制器(µC)及其内部外设的软件模块。任务使更高的软件层与微控制器(µC)保持独立。特性实现:依赖于微控制器(µC)的上层(此处“Upper”可能指的是该层之上的软件层或接口,即该层的实现是依赖于µC的,但其为上层提供了与µC无关的接口)。
2024-10-17 23:12:04
775
原创 【C语言】预处理详解
define reg register //为 register这个关键字,创建一个简短的名字;) //用更形象的符号来替换一种实现case //在写case语句的时候自动把 break写上。// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。提问:在define定义标识符的时候,要不要在最后加上;?比如:建议不要加上;,这样容易导致问题。比如下面的场景:这里会出现语法错误。
2024-08-03 12:35:05
907
原创 【C语言】程序环境
在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。
2024-07-31 21:49:50
278
原创 【C语言】动态内存管理和柔性数组详解
C语言提供了一个动态内存开辟的函数:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
2024-07-20 21:57:09
785
原创 【C语言】自定义类型:结构体,枚举,联合详解
有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。
2024-07-18 17:12:08
849
原创 【C语言】内存函数的介绍与模拟实现
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。return 0;比较从ptr1和ptr2指针开始的num个字节返回值如下:int main()int n;
2024-07-08 17:37:46
307
原创 【C语言】strstr,strtok和strerror函数的介绍与模拟实现
sep参数是个字符串,定义了用作分隔符的字符集合。第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
2024-07-07 00:14:26
402
原创 【C语言】字符函数和字符串函数的介绍和模拟实现
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组 中。字符串常量 适用于那些对它不做修改的字符串函数。字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。参数指向的字符串必须要以 '\0' 结束。注意函数的返回值为size_t,是无符号的( 易错 )
2024-07-05 16:39:39
831
原创 【C语言】指针和数组经典练习题(一)
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。3. 除此之外所有的数组名都表示首元素的地址。
2024-06-30 23:40:10
433
原创 【C语言】回调函数(qsort模拟实现)
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个 函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数 的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进 行响应。使用回调函数,模拟实现qsort(采用冒泡的方式)。注意:这里第一次使用 void* 的指针,讲解 void* 的作用。
2024-06-25 10:04:07
575
原创 【C语言】函数指针数组和指向函数指针数组的指针
那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢?数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组。是int (*)()类型的函数指针。函数指针数组的用途:转移表。
2024-06-22 17:34:16
759
原创 【C语言】函数指针
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参 数,返回值类型为void。首先,能给存储地址,就要求pfun1或者pfun2是指针,那哪个是指针?与数组不同:int arr[];输出的是两个地址,这两个地址是 test 函数的地址。那我们的函数的地址要想保存起来,怎么保存?经过查阅资料得知:&Add == Add。
2024-06-20 19:38:36
745
原创 【C语言】 指针数组和数组指针
数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。那数组指针应该是:能够指向数组的指针。下面代码哪个是数组指针?//p1, p2分别是什么?解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个 指针,指向一个数组,叫数组指针。这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
2024-06-17 21:45:36
737
原创 【C语言】字符指针
这里str3和str4指向的是一个同一个常量字符串。但是用相同的常量字符串去初始化 不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。特别容易让同学以为是把字符串 hello bit放到字符指针 pstr 里了,但是/本质是把字符串 hello bit. 首字符的地址放到了pstr中。上面代码的意思是把一个常量字符串的首字符h的地址存放到指针变量 pstr 中。从监视可以看出,str1和str2放在栈区,str3和str4放在常量区。
2024-06-16 23:57:01
593
原创 浮点型在内存中的存储
常见的浮点数:3.141591E10浮点数家族包括: float、double、long double 类型。浮点数表示的范围:float.h中定义。
2024-06-14 23:19:21
811
原创 深度剖析数据在内存中的存储(整型)
什么大端小端:大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中。小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。为什么有大端和小端:为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元 都对应着一个字节,一个字节为8 bit。
2024-06-10 23:30:07
1144
原创 位图与布隆过滤器
1. 面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】1. 遍历,时间复杂度O(N)2. 排序(O(NlogN)),利用二分查找: logN3. 位图解决数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一 个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0 代表不存在。比如:2. 位图概念所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。
2024-06-09 16:54:34
1056
原创 C++哈希详解
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素 时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O($log_2 N$),搜索的效率取决于搜索过程中元素的比较次数。
2024-06-08 00:22:39
2589
原创 unordered_map介绍
1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2024-06-08 00:02:45
378
原创 const详解
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。将const 在指针前进行修饰,那么就修饰指针所指向的变量。将const 在指针后进行修饰,那么就修饰指针变量本身。但是,可以通过取地址进行修改。但是指针指向的内容可以被修改。但是指针变量可以被修改。
2024-06-07 23:56:19
380
原创 map和set的模拟实现
迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代 器,需要考虑以前问题:begin()与end()STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后, 可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位 置,end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?能否给成nullptr呢?
2024-06-06 10:55:12
469
原创 红黑树详解
enum ColorRED,BLACK,// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域Color _col;// 节点的颜色, _kv(kv)
2024-06-03 23:53:22
2300
原创 AVL 树详解
向二叉搜索树中插入新结点后,如果能保证每个结点的左右 子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均 搜索长度。
2024-06-02 16:26:45
1419
原创 map和set
1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。
2024-06-01 10:40:49
1221
原创 C++之二叉树进阶
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。
2024-05-26 00:24:05
1184
原创 C++之多态详解
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-05-25 00:44:08
2232
原创 C++中的继承详解
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设 计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。3. 继承和组合public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。
2024-05-23 00:43:20
982
原创 C++之模版进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链 接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2. 增强了代码的灵活性。【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长。2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-05-21 22:55:53
871
1
原创 priority_queue的介绍、使用和模拟实现
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2024-04-30 20:52:45
521
原创 queue的介绍、使用和模拟实现
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的 成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操 作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。
2024-04-30 20:44:25
488
原创 stack的介绍、使用和模拟实现
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作:empty:判空操作back:获取尾部元素操作。
2024-04-30 20:38:29
393
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人