【区块链安全 | 第十四篇】类型之值类型(一)
文章目录
- 值类型
- 布尔值
- 整数
- 运算符
- 取模运算
- 指数运算
- 定点数
- 地址(Address)
- 类型转换
- 地址成员
- balance 和 transfer
- send
- call,delegatecall 和 staticcall
- code 和 codehash
- 合约类型(Contract Types)
- 固定大小字节数组(Fixed-size byte arrays)
- 地址字面量(Address Literals)
Solidity 是一种静态类型语言,这意味着每个变量(无论是状态变量还是局部变量)都需要指定其类型。Solidity 提供了几种基本类型,这些类型可以组合形成复杂类型。
此外,不同类型可以在包含运算符的表达式中相互作用,并且具有优先级的区分。
Solidity 没有“未定义”或“空”值的概念,但新声明的变量总是具有默认值,该默认值取决于其类型。为了处理任何意外的值,应该使用 revert
函数回滚整个交易,或者返回一个带有布尔值的元组,其中第二个 bool
值表示操作是否成功。
值类型
值类型的变量始终按值传递,即在作为函数参数或赋值时总是被复制。
与引用类型不同,值类型的声明不指定数据位置,因为它们足够小,可以存储在栈中。唯一的例外是状态变量,状态变量默认存储在存储中,但也可以标记为 transient、constant 或 immutable。
布尔值
bool
:值是 true
或 false
。
整数
int
/ uint
:各种大小的有符号和无符号整数。
关键字 uint8
到 uint256
(以 8 为步长,表示 8 位到 256 位的无符号整数),以及 int8
到 int256
。
uint
和 int
分别是 uint256
和 int256
的别名。
运算符
比较运算符:<=
,<
,==
,!=
,>=
,>
(结果为 bool
)
位运算符:&
,|
,^
(按位异或),~
(按位取反)
移位运算符:<<
(左移),>>
(右移)
算术运算符:+
,-
,一元 -
(仅适用于有符号整数),*
,/
,%
(取模),**
(指数运算)
对于整数类型 X
,可以使用 type(X).min
和 type(X).max
来访问该类型可表示的最小值和最大值。
运算符 ||
和 &&
遵循短路规则。这意味着在表达式 f(x) || g(y)
中,如果 f(x)
计算结果为 true
,则 g(y)
将不会被计算。
注意
Solidity 中的整数受到特定范围的限制。例如,对于 uint32
,其范围为 0
到 2**32 - 1
。
在 Solidity 中,整数运算有两种模式:“溢出”模式(wrapping/unchecked mode) 和 “检查”模式(checked mode)。
默认情况下,运算始终处于 “检查”模式,这意味着如果运算结果超出了类型的值范围,则调用会因失败的断言而回滚。
可以使用 unchecked { ... }
切换到 “溢出”模式,但应谨慎使用。
取模运算
%
的结果是操作数 a
除以操作数 n
后的余数 r
,其中 q = int(a / n)
,并且 r = a - (n * q)
。
这意味着取模运算的结果与其左操作数的符号相同(或为零),并且对于负数 a
,a % n == -(-a % n)
恒成立:
int256(5) % int256(2) == int256(1)int256(5) % int256(-2) == int256(1)int256(-5) % int256(2) == int256(-1)int256(-5) % int256(-2) == int256(-1)
注意:使用 0 作为取模运算的除数会导致 Panic
错误。此检查无法通过 unchecked { ... }
关闭。
指数运算
指数运算 **
仅适用于无符号类型作为指数(幂)。指数运算的结果类型始终与底数的类型相同。请确保底数足够大以容纳结果,并预防潜在的断言失败或溢出行为。
注意:在 检查模式(checked mode)下,对于较小的底数,指数运算仅使用相对廉价的 EXP
操作码。
例如,在计算 x**3
时,使用 x*x*x
可能更便宜。因此,建议进行 Gas 成本测试 并使用优化器。此外,EVM 规定 0**0
的结果为 1
。
定点数
警告:定点数在 Solidity 中尚不完全支持。它们可以被声明,但不能进行赋值操作。
fixed
/ ufixed
:带符号和无符号定点数,具有不同的大小。关键字 ufixedMxN
和 fixedMxN
,其中 M 代表类型所占用的位数,N 代表可用的小数位数。M 必须是 8 的倍数,范围从 8 到 256 位。N 必须在 0 到 80 之间(包含 0 和 80)。ufixed
和 fixed
是 ufixed128x18
和 fixed128x18
的别名。
操作符
-
比较操作符:
<=
,<
,==
,!=
,>=
,>
(结果为布尔值) -
算术操作符:
+
,-
,一元-
(仅对带符号数),*
,/
,%
(取模)
注意:浮动点数(许多语言中的 float
和 double
,更精确地说是 IEEE 754 数字)和定点数的主要区别在于,浮动点数用于表示整数和小数部分的位数是灵活的,而定点数则严格定义了每部分所占的位数。通常,在浮动点数中,几乎整个空间用于表示数字,而只有少数位数用于定义小数点的位置。
地址(Address)
地址类型有两种主要相似的变体:
address
:持有一个 20 字节的值(以太坊地址的大小)。address payable
:与address
相同,但具有额外的transfer
和send
成员。
这种区分的想法是,address payable
是一个可以接收以太币的地址,而普通的 address
不能接收以太币,例如,它可能是一个不支持接收以太币的智能合约。
类型转换
1.允许从 address payable
到 address
的隐式转换,而从 address
到 address payable
必须通过显式转换 payable(<address>)
。
2.允许显式转换到 address
类型并返回 uint160
、整数字面量、bytes20
和合约类型。
3.只有 address
类型和合约类型的表达式可以通过显式转换 payable(...)
转换为 address payable
。对于合约类型,只有在合约可以接收以太币的情况下(即合约有 receive
或 payable
回退函数)才能进行这种转换。注意,payable(0)
是有效的,且是这一规则的例外。
注意
如果我们需要一个 address
类型的变量,并计划向其发送以太币,那么应将其声明为 address payable
以使该要求更加明显。此外,尽量在最早阶段做出这种区分或转换。
从 0.5.0 版本开始,address
和 address payable
之间的区分被引入。自那时起,合约不能隐式转换为 address
类型,但如果它们有 receive
或 payable
回退函数,仍然可以显式地转换为 address
或 address payable
。
地址成员
balance 和 transfer
可以使用 balance
属性查询地址的余额,并使用 transfer
函数将以太币(以 wei 为单位)发送到可支付的地址:
address payable x = payable(0x123);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
transfer
函数在当前合约的余额不足或接收方帐户拒绝接收以太币时失败,并会回滚操作。
注意
如果 x
是一个合约地址,它的代码(更具体地说:其 Receive Ether
函数如果存在,或其他回退函数如果存在)将在 transfer
调用时一起执行,这是 EVM 的特性,无法阻止。如果该执行耗尽了 gas 或以任何方式失败,Ether 转账将回滚,当前合约将停止并抛出异常。
send
send
是 transfer
的低级对等函数。如果执行失败,当前合约不会停止并抛出异常,而是返回 false
。
使用 send
时存在一些危险:如果调用堆栈深度达到 1024(调用者可以强制此情况),或者接收方耗尽 gas,则转账将失败。因此,为了安全地转账以太币,始终检查 send
的返回值,使用 transfer
或更好的方式是使用一个模式,其中接收方自己提取以太币。
call,delegatecall 和 staticcall
为了与不符合 ABI 的合约交互,或为了更直接地控制编码,可以使用 call
、delegatecall
和 staticcall
函数。它们都接受一个字节内存参数,并返回成功条件(布尔值)和返回的数据(字节内存)。abi.encode
、abi.encodePacked
、abi.encodeWithSelector
和 abi.encodeWithSignature
可以用来编码结构化数据。
示例:
bytes memory payload = abi.encodeWithSignature("register(string)", "MyName");
(bool success, bytes memory returnData) = address(nameReg).call(payload);
require(success);
注意,这些都是低级函数,应该小心使用。特别是,任何未知的合约可能是恶意的,如果调用它,你将把控制权交给该合约,而该合约可能会再次调用你的合约,因此当调用返回时,需要做好准备处理可能会更改的状态变量。与其他合约交互的常规方式是调用合约对象上的函数(例如 x.f()
)。
可以使用 gas
修饰符调整提供的 gas:
address(nameReg).call{gas: 1000000}(abi.encodeWithSignature("register(string)", "MyName"));
类似地,也可以控制提供的 Ether 数量:
address(nameReg).call{value: 1 ether}(abi.encodeWithSignature("register(string)", "MyName"));
最后,这些修饰符可以结合使用,它们的顺序无关紧要:
address(nameReg).call{gas: 1000000, value: 1 ether}(abi.encodeWithSignature("register(string)", "MyName"));
类似地,可以使用 delegatecall
函数,不同之处在于,只有给定地址的代码会被使用,所有其他方面(存储、余额等)都来自当前合约。delegatecall
的目的是使用存储在另一个合约中的库代码。用户必须确保两个合约的存储布局适合使用 delegatecall
。
code 和 codehash
你可以查询任何智能合约的已部署代码。使用 .code
获取 EVM 字节码作为字节内存(可能为空)。使用 .codehash
获取该代码的 Keccak-256 哈希(作为 bytes32
)。注意,addr.codehash
比使用 keccak256(addr.code)
更便宜。
如果与 addr
相关联的帐户为空或不存在(即它没有代码、零余额和零 nonce,如 EIP-161 所定义),则 addr.codehash
的输出可能为 0。如果该帐户没有代码,但有非零余额或 nonce,则 addr.codehash
将输出空数据的 Keccak-256 哈希(即 keccak256("")
,其结果为 c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
)。
注意,所有合约都可以转换为 address
类型,因此可以使用 address(this).balance
查询当前合约的余额。
合约类型(Contract Types)
每个合约都定义了自己的类型。你可以将合约隐式转换为它继承的合约类型。合约类型可以显式地转换为 address
类型,反之亦然。
显式转换到 address payable
类型仅在合约类型有 receive
或 payable
回退函数时才可能。转换仍然通过 address(x)
进行。如果合约类型没有 receive
或 payable
回退函数,可以使用 payable(address(x))
进行转换。
注意
1.如果你声明一个合约类型的局部变量(例如 MyContract c
),你可以在该合约上调用函数。需要注意的是,必须从与之相同的合约类型赋值给该变量。
2.你也可以实例化合约(这意味着它们是新创建的)。你可以在“通过 new 创建合约”部分找到更多的细节。
3.合约的数据显示方式与 address
类型相同,并且这种类型也用于 ABI 中。
4.合约不支持任何操作符。
5.合约类型的成员是该合约的外部函数,包括任何标记为 public
的状态变量。
6.对于合约 C
,你可以使用 type(C)
来访问有关该合约的类型信息。
固定大小字节数组(Fixed-size byte arrays)
值类型 bytes1
, bytes2
, bytes3
, …, bytes32
用于存储从 1 到 32 字节的字节序列。
操作符:
- 比较操作符:
<=
,<
,==
,!=
,>=
,>
(返回布尔值) - 位操作符:
&
,|
,^
(按位异或),~
(按位取反) - 移位操作符:
<<
(左移),>>
(右移) - 索引访问:如果
x
是类型bytesI
,则x[k]
(0 <= k < I)返回第k
个字节(只读)。
移位操作符与无符号整数类型作为右操作数一起工作(但返回左操作数的类型),表示要移位的位数。使用有符号类型进行移位会导致编译错误。
成员.length
可以返回字节数组的固定长度(只读)。
注意
类型 bytes1[]
是字节的数组,但由于填充规则,对于每个元素,它浪费 31 字节的空间(在存储中除外)。最好使用 bytes
类型。
地址字面量(Address Literals)
地址字面量是通过地址校验和测试的十六进制字面量,例如 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF
是 address
类型。长度在 39 到 41 位之间且未通过校验和测试的十六进制字面量会产生错误。
我们可以通过在前面(对于整数类型)或后面(对于 bytesNN
类型)加零来去除错误。
相关文章:
【区块链安全 | 第十四篇】类型之值类型(一)
文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址(Address)类型转换地址成员balance 和 transfersendcall,delegatecall 和 staticcallcode 和 codehash 合约类型(Contract Types)固定大小字节数组&#x…...
一款超级好用且开源免费的数据可视化工具——Superset
认识Superset 数字经济、数字化转型、大数据等等依旧是如今火热的领域,数据工作有一个重要的环节就是数据可视化。 看得见的数据才更有价值! 现如今依旧有多数企业号称有多少多少数据,然而如果这些数据只是呆在冷冰冰的数据库或文件内则毫无…...
android gradle一直编译不下来,可能是打开了gradle离线模式
gradle离线模式 当然,如果本地已经将gradle,lib都下载下来了,也可以打开这个离线模式,不然重启AS的时候可能会重新走一次下载流程...
(C语言)学生信息表(学生管理系统)(基于通讯录改版)(正式版)(C语言项目)
1.首先是头文件: //student.h //头文件//防止头文件被重复包含#pragma once//宏定义符号常量,方便维护和修改 #define ID_MAX 20 #define NAME_MAX 20 #define AGE_MAX 5 #define SEX_MAX 5 #define CLA_MAX 20 //定义初始最大容量 #define MAX 1//定义结…...
【Linux】Linux 系统启动流程详解
1. BIOS/UEFI 阶段 硬件自检(POST) BIOS/UEFI 执行硬件检查(内存、CPU、外设等)。若硬件异常,通过蜂鸣码或屏幕提示错误。 选择启动设备 按配置顺序(硬盘、U盘、网络等)寻找可引导设备。BIOS&a…...
Jetson 设备卸载 OpenCV 4.5.4 并编译安装 OpenCV 4.2.0
一、卸载 OpenCV 4.5.4 清除已安装的 OpenCV 库 sudo apt-get purge libopencv* python3-opencv # 卸载所有APT安装的OpenCV包:ml-citation{ref"1,3" data"citationList"}sudo apt autoremove # 清理残留依赖:ml-citation{ref"1,4"…...
【计算机网络】OSI七层模型完全指南:从比特流到应用交互的逐层拆解
OSI模型 导读一、概念二、模型层次结构2.1 物理层(Physical Layer)2.2 数据链路层(Data Link Layer)2.3 网络层(Network Layer)2.4 传输层(Transport Layer)2.5 会话层&…...
渗透测试:登录页面的测试-弱口令思路和实战
渗透测试:登录页面的测试思路和实战 渗透测试(Penetration Testing),也称为“渗透性测试”,是一种评估计算机系统、网络或Web应用安全性的一种方法。它通过模拟真实世界中的攻击手段和策略,来检测目标系统…...
Android BottomNavigationView 完全自定义指南:图标、文字颜色与选中状态
1. 核心功能概述 通过 Material Design 的 BottomNavigationView,你可以轻松实现以下自定义: ✅ 动态切换选中/默认图标 ✅ 自定义选中与默认文字颜色 ✅ 控制文字显示模式(始终显示/仅选中显示/自动隐藏) ✅ 添加动画和高级样…...
提示词工程
参考网站:提示工程指南 – Nextra 声明:我现在也才刚刚开始学习 人工智能,我会着重于 agent 的学习,如果有不对的地方请大家及时指出。 模型设置 前言 在向大模型发送请求时,常常能看到以下参数: {&qu…...
分页查询原理与优化方案完全指南
分页查询原理与优化方案完全指南 一、分页查询基础原理 1.1 传统分页实现方式 分页查询的核心目的是将大数据集分割成多个小块进行展示,最常见的实现方式是使用LIMIT-OFFSET语法: -- 基础分页查询 SELECT * FROM table_name ORDER BY id LIMIT page_size OFFSET (page_n…...
嵌入式软件设计规范框架(MISRA-C 2012增强版)
以下是一份基于MISRA-C的嵌入式软件设计规范(完整技术文档框架),包含编码规范、安全设计原则和工程实践要求: 嵌入式软件设计规范(MISRA-C 2012增强版) 一、编码基础规范 1.1 文件组织 头文件保护 /* 示…...
课程6. 决策树
课程6. 决策树 决策树直觉模型结构几何解释决策树的构建ID3算法信息内容标准使用决策树处理差距推广到回归问题分支标准与经典损失函数的关系 过度拟合和欠拟合欠拟合过拟合 优点和缺点案例随机生成数据集分类IRIS 数据集解决回归问题的一个简短例子 决策树 今天我们继续探索一…...
【UE5.3.2】初学1:适合初学者的入门路线图和建议
3D人物的动作制作 大神分析:3D人物的动作制作通常可以分为以下几个步骤: 角色绑定(Rigging):将3D人物模型绑定到一个骨骼结构上,使得模型能够进行动画控制。 动画制作(Animation):通过控制骨骼结构,制作出人物的各种动作,例如走路、跳跃、打斗等。 动画编辑(Ani…...
OpenCV 图形API(4)内核 API
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 G-API 背后的核心理念是可移植性——使用 G-API 构建的流水线必须是可移植的(或者至少具备可移植的能力)。这意味着&…...
pom.xml与.yml,java配置参数传递
pom.xml与 .yml java配置参数传递 在Java项目中,通过 pom.xml 和 .yml 文件(如 application.yml)传递变量通常涉及 构建时(Maven)和 运行时(Spring Boot)两个阶段的配置。以下是具体的实现方法&…...
LeetCode算法题(Go语言实现)_21
题目 给你一个整数数组 arr,如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 一、代码实现 func uniqueOccurrences(arr []int) bool {freq : make(map[int]int)// 统计每个数字的出现次数for _, num : range arr {freq[n…...
Docker部署前后端分离项目
镜像下载 在有网络的电脑下载镜像(Windows):依次在CMD命令台执行以下代码 docker pull node:20docker pull openjdk:22-jdkdocker pull mysql:8.0docker pull nginx:1.27 删除镜像代码: docker rmi node:latest 查看镜像列表…...
Linux系统安装MySQL 8.0完整指南(新手友好版)
MySQL作为最流行的开源关系型数据库之一,广泛应用于各种开发和生产环境。本教程将详细介绍在Linux系统上安装MySQL 8.0的全过程,包括卸载旧版本、安装新版本、基础配置和远程连接设置,特别适合Linux新手学习使用。 一、卸载旧版MySQL&#x…...
第二次作业
#创建表,把id设为主键 mysql> create table test02(-> id int primary key, #----主键约束-> name varchar(50)-> ); Query OK, 0 rows affected (0.02 sec) #插入数据测试 mysql> insert into test02 values(1,"成都"); Query OK, 1 r…...
AI大模型下传统 Spring Java工程开发的演进和变化方向
1. 背景和动因 传统Spring开发优势:Spring生态以稳定、模块化、依赖注入(DI)等特性著称,长期支撑企业级应用开发,具备高扩展性和可维护性。AI大模型崛起:近几年,LLM(如GPT-4、LLaMA…...
周学习总结
这周继续学习了Java的知识点,还写了考查递归、递推与贪心的算法题。 算法小结 递归与递推一般是观察观察题干,分析题目的规律,可能还会用到分治算法,推导出一个合理的表达式,再使用函数递归来进行求解。 贪心在求解时…...
19.思科路由器:OSPF协议引入直连路由的实验研究
思科路由器:OSPF协议引入直连路由的实验研究 一、实验拓扑二、基本配置2.1、sw1的配置2.2、开启交换机三层功能三、ospf的配置3.1、R1的配置3.2、R2的配置3.3、重启ospf进程四、引入直连路由五、验证结果随着互联网技术的不断发展,路由器作为网络互联的关键设备,其性能与稳定…...
Zcanpro搭配USBCANFD-200U在新能源汽车研发测试中的应用指南(周立功/致远电子)
——国产工具链的崛起与智能汽车测试新范式 引言:新能源汽车测试的国产化突围 随着新能源汽车智能化、网联化程度的提升,研发测试面临三大核心挑战:多协议融合(CAN FD/LIN/以太网)、高实时性数据交互需求、复杂工况下…...
JSON的基础知识
文章目录 前言json协议的基本格式json 数组类型 的语法规则json协议报文的实例json常见的一些格式错误在gd32中使用cjson库小结 前言 json协议在互联网应用,物联网应用中都会用到。所谓工欲善其事必先利其器,我们需要学习了解json协议的具体格式…...
week2|机器学习(吴恩达)学习笔记
一、多维特征 1.1、什么是多维特征? 1)在我们的原始估计房价的版本中,我们只有一个变量: x x x 来预估 y y y 2)但是现在假设你也知道其他的参数变量,那么我们就可以引入多个参数来提高预测 y y y的准确…...
各类神经网络学习:(七)GRU 门控循环单元(上集),详细结构说明
上一篇下一篇LSTM(下集)GRU(下集) GRU(门控循环单元) 它其实是 R N N RNN RNN 和 L S T M LSTM LSTM 的折中版,有关 R N N RNN RNN 和 L S T M LSTM LSTM 请参考往期博客。 实际应用要比 …...
uniapp利用第三方(阿里云)实现双人视频/音频通话功能(附完整的项目代码)
要在UniApp中利用阿里云实现双人视频/音频通话功能,你需要使用阿里云的实时音视频服务(RTC)。以下是一个基本的实现步骤和示例代码。 基本的操作步骤 注册阿里云账号并开通RTC服务: 访问阿里云官网,注册账号并开通RTC服务。 获取AppID和AppKey: 在RTC控制台创建应用,…...
wsl2的centos7安装jdk17、maven
JDK安装 查询系统中的jdk rpm -qa | grep java按照查询的结果,删除对应版本 yum -y remove java-1.7.0-openjdk*检查是否删除 java -version 下载JDK17 JDK17,下载之后存到wsl目录下(看你自己)然后一键安装 sudo rpm -ivh jd…...
Android 单例模式全解析:从基础实现到最佳实践
单例模式(Singleton Pattern)是软件开发中常用的设计模式,其核心是确保一个类在全局范围内只有一个实例,并提供全局访问点。在 Android 开发中,单例模式常用于管理全局资源(如网络管理器、数据库助手、配置…...
Redis GEO
Redis GEO 引言 Redis GEO是Redis数据库中的一种高级功能,允许用户存储地理位置信息并执行基于地理空间查询的操作。本文将详细介绍Redis GEO的基本概念、使用方法以及在实际应用中的优势。 基本概念 GEO编码 GEO编码是指将地理位置信息(如经纬度&a…...
vulnhub-serile靶机通关攻略
下载地址:https://www.vulnhub.com/entry/serial-1,349/ 靶机安装特殊,附带安装参考文章:https://zhuanlan.zhihu.com/p/113887109 扫描IP地址 arp-scan -l扫描端口 nmap -p- 192.168.112.141访问80端口 线索指向cookie cookie是base64编…...
SAP-ABAP:OData 协议深度解析:架构、实践与最佳应用
OData 协议深度解析:架构、实践与最佳应用 一、协议基础与核心特性 协议定义与目标 定位:基于REST的开放数据协议,标准化数据访问接口,由OASIS组织维护,最新版本为OData v4.01。设计哲学:通过统一资源标识符(URI)和HTTP方法抽象数据操作,降低异构系统集成复杂度。核心…...
408 计算机网络 知识点记忆(3)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
java学习笔记10——集合框架
枚举类的使用 Collection接口继承树 Map接口继承树 Collection 接口方法 总结: 集合框架概述 1.内存层面需要针对于多个数据进行存储。此时,可以考虑的容器有:数组、集合类2.数组存储多个数据方面的特点:> 数组一旦初始化,其长度就是确定的…...
埃文科技企业AI大模型一体机——昇腾体系+DeepSeek+RAG一站式解决方案
面对企业级市场海量数据资产与复杂业务场景深度耦合的刚需,埃文科技重磅推出基于华为昇腾算力DeepSeek大模型的企业一体机产品,提供DeepSeek多版本大模型一体机选择,为企业提供本地昇腾算力DeepSeek大模型RAG知识库的一体化解决方案ÿ…...
蓝桥杯---BFS解决FloofFill算法1---图像渲染
文章目录 1.算法简介2.题目概述3.算法原理4.代码分析 1.算法简介 这个算法是关于我们的floodfill的相关的问题,这个算法其实从名字就可以看出来:洪水灌溉,其实这个算法的过程就和他的名字非常相似,下面的这个图就生动的展示了这个…...
个人博客网站从搭建到上线教程
步骤1:设计个人网站 设计个人博客网站的风格样式,可以在各个模板网站上多浏览浏览,以便有更多设计网站风格样式的经验。 设计个人博客网站的内容,你希望你的网站包含哪些内容如你的个人基本信息介绍、你想分享的项目、你想分享的技术文档等等。 步骤2:选择开发技术栈 因…...
【FreeRTOS】裸机开发与操作系统区别
🔎【博主简介】🔎 🏅CSDN博客专家 🏅2021年博客之星物联网与嵌入式开发TOP5 🏅2022年博客之星物联网与嵌入式开发TOP4 🏅2021年2022年C站百大博主 🏅华为云开发…...
力扣每日一题:2712——使所有字符相等的最小成本
使所有字符相等的最小成本 题目示例示例1示例2 题解这些话乍一看可能看不懂,但是多读两遍就明白了。很神奇的解法,像魔术一样。 题目 给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标…...
Java EE(17)——网络原理——IP数据报结构IP协议解析(简述)
一.IP数据报结构 (1)版本:指明协议的版本,IPv4就是4,IPv6就是6 (2)首部长度:单位是4字节,表示IP报头的长度范围是20~60字节 (3)8位区分服务:实际上只有4位TOS有效,分别是最小延时,最…...
Pycharm运行时报“Empty suite”,可能是忽略了这个问题
问题:使用Pycharm运行testcases目录下的.py文件,报“Empty suite”,没有找到测试项。 排查过python解释器、pytest框架安装等等,依然报这个错,依然没找到,最后终端运行: pytest test_demo.py&a…...
Linux快速安装docker和docker-componse步骤
在 CentOS 7 上安装 Docker 和 Docker Compose 的步骤如下: 1. 安装 Docker 1.1. 更新系统 首先,确保你的系统是最新版本: sudo yum update -y1.2. 安装必要的包 安装 yum-utils,这是管理 YUM 源的工具: sudo yu…...
OP2177运算放大器:高性能模拟信号处理的关键元件
在现代电子系统中,模拟信号处理至关重要,运算放大器作为模拟电路的核心部件,其性能优劣直接影响系统的整体表现。OP2177 是一款具有卓越性能的运算放大器,在众多领域有着广泛应用。以下将结合相关资料,对 OP2177 进行全…...
paddle ocr
paddle ocr paddle ocr笔记准备工作referenceto onnx文本检测文本检测文字识别 paddle ocr笔记 准备工作 下载字典ppocr_keys_v1.txt,下标从1开始模型转换 reference paddlepaddle to onnx 下载模型,或者直接使用python跑一下并且把本地模型拿过来…...
通过动态获取项目的上下文路径来确保请求的 URL 兼容两种启动方式(IDEA 启动和 Tomcat 部署)下都能正确解析
背景 因为在不同的启动环境下,获取上下文路径的方式需要有所调整。在 IDEA 中运行时,路径是基于当前页面的 URL(如 index.html),而在 Tomcat 部署时,它是基于项目上下文路径(如 ssm-project&am…...
Spring Boot 整合 ElasticJob 分布式任务调度教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 整合 ElasticJob 分布式任务调度教程 一、ElasticJob 简介 ElasticJob 是当当网开源的分布式任务调度解决方案,支持: …...
Django项目之订单管理part6(message组件和组合搜索组件)
一.前言 我们前面讲的差不多了,接着上节课讲,今天要来做一个撤单要求,我们可以用ajax请求,但是我这里介绍最后一个知识点,message组件,但是我会把两种方式都讲出来的,讲完这个就开始讲我们最重…...
[MySql] 多表关系, 多表查询
一. 多表关系 1.1 一对多 例如: 员工 - 部门表 (一个部门可以有多个员工) 并且在多的一方增加一个字段关联一的一方的主键. 外键约束: 物理外键 (使用 foreign key 定义外键关联另一张表的主键) 缺点: 影响增删改效率; 仅用于单节点, 不适用与集群; 易引发死锁, 性能低; …...
Open GL ES ->GLSurfaceView在正交投影下的图片旋转、缩放、位移
XML文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:o…...