
获得徽章 0
- 评论点赞
- ## 为什么buffer使用16进制来表示
比如:
const buffer = Buffer.from('Hello, World!', 'utf8');
console.log(buffer); // 输出: <Buffer 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21>
每个16 进制数字可以表示4 位二进制数,而1 个字节包含 8 位二进制数。因此,两个十六进制字符刚好表示 1 个字节。
详细解释:
十六进制的基本特性:
十六进制使用 0 到 F 来表示 16 个数值:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F。
每个十六进制数字可以表示的范围是 0 到 15,相当于二进制的 0000 到 1111,也就是 4 位二进制数。
二进制与十六进制的关系:
1 个字节 = 8 位二进制(bit)。
因为 1 个十六进制数字表示 4 位二进制数(bit),所以用两个十六进制数字就能表示 8 位,也就是 1 个字节。
假设你有一个字节的二进制数据:11001010。
可以将这个 8 位二进制分为两组,每组 4 位:
1100 和 1010。
分别对应的十六进制值是:
1100 对应 C,
1010 对应 A。
因此,11001010 用十六进制表示就是 CA。
使用16进制会更简洁易读,如果使用二进制显示相同的数据会显得冗长,比如字母 H 的二进制是 01001000,但用 16 进制表示就是 48,更加简洁易读。
另外使用16进制也是标准惯例:在显示计算机处理的低级数据时(如内存地址、网络传输、文件存储),16 进制是最常用的表示方式。尤其是在处理二进制数据时,如网络数据包、文件内容或缓冲区(Buffer)数据时,使用 16 进制可以帮助开发者快速读取和分析。展开评论点赞 - ## rust 所有权转移问题解决思路
类似如下报错:
cannot move out of here
| move occurs because `list[_]` has type `T`, which does not implement the `Copy` trait
| help: consider borrowing here: `&list[0]`
1. 首先Rust规定引用不允许转移所有权
2. list是切片引用类型 &[T](引用的是数组某些元素的切片),但是list里的元素是T类型,而不是&T
3. 对于 Copy 类型(如 i32、u32 等),索引操作会直接将值复制到新的变量中,因此不会引起所有权转移。
对于非 Copy 类型(如 String、Vec 等),如果你尝试通过索引操作将值赋给一个变量,Rust 会尝试移动该值,从而导致所有权转移。
4. 但是引用又不允许所有权转移,所以报错,把T加上 Copy 约束,这个特征表示类型 T 的值是可以被“复制”的,而不是移动的。对于实现了 Copy 特征的类型,Rust 在赋值时会自动执行浅拷贝,而不是移动所有权。展开评论点赞 - ## 栈帧和函数执行上下文
栈帧
定义: 栈帧是函数调用时在栈上分配的一块内存区域,用于存储函数的局部变量、参数、返回地址等信息。
作用:
管理函数调用: 每个函数调用都会创建一个新的栈帧,函数执行完毕后,栈帧被销毁。
存储数据: 栈帧为函数的执行提供了独立的内存空间,保证不同函数之间的数据不冲突。
实现递归: 递归函数的每一层调用都会创建一个新的栈帧,从而实现递归的层层深入和回溯。
函数执行上下文
定义: 函数执行上下文是JavaScript引擎在执行代码时创建的一个抽象概念,它定义了变量或函数有权访问的变量对象以及this的值。
作用:
提供执行环境: 函数执行上下文为函数的执行提供了必要的环境,包括变量对象、this对象等。
管理变量作用域: 不同的函数执行上下文具有不同的变量对象,从而实现了变量的作用域。
两者之间的关系
栈帧是执行上下文的底层实现: 栈帧为函数执行上下文提供了内存空间,存储了函数执行所需的数据。
执行上下文是栈帧的抽象: 执行上下文更关注函数执行的语义和环境,而栈帧更关注内存的分配和管理。
栈帧与执行上下文一一对应: 每个函数调用都会创建一个新的栈帧,同时也会创建一个新的执行上下文。展开等人赞过331 - #每天一个知识点#
## rollup 压缩插件
使用 @rollup/plugin-terser 压缩代码时,如果出现出现 undefined报错相关问题,是因为是因为插件把你的代码过度混淆了,可以使用 reserved 解决
terser({
mangle: {
reserved: ['UppyImageUpload'], // 保留指定的全局变量不被混淆
},
}),
另外还有其他选项
mangle: {
toplevel: true, // 混淆顶层作用域中的标识符
reserved: ['MyLibrary'], // 保留特定标识符不被混淆
properties: {
regex: /^_/ // 混淆以 _ 开头的对象属性名
},
keep_classnames: true, // 保留类名不被混淆
keep_fnames: true, // 保留函数名不被混淆
},展开赞过53 - #每天一个知识点#
## git 设置大小写敏感
macos 的 HFS+ 或 APFS系统是大小写不敏感的,可能你在mac上能跑的项目到了linux就报路径找不到之类的错误了,这点要注意。
使macos 下的git 大小写敏感可以使用以下命令
git config --global core.ignorecase false展开评论点赞 - #每天一个知识点#
## 预检请求
简单请求不会触发预检请求:
简单请求的定义:
一个请求被认为是"简单请求",如果它满足以下所有条件:
使用以下方法之一:GET、HEAD、POST
请求中没有使用 ReadableStream 对象
除了用户代理自动设置的头部(如 Connection、User-Agent 等)外,只能手动设置以下头部:
Accept
Accept-Language
Content-Language
Content-Type(但只限于以下值):
application/x-www-form-urlencoded
multipart/form-data
text/plain展开评论点赞 - #每天一个知识点#
## Buffer 和 Stream
Buffer 是用于处理二进制数据的一种方式,它将整个数据一次性加载到内存中。这适用于需要对整个数据集进行快速访问和操作的情况。
特点
一次性加载:整个数据集一次性加载到内存中。
快速访问:可以快速地进行随机访问和操作。
适合小数据:适合处理小而有限的数据集,例如文件读写、加密操作等。
占用内存:大数据集会占用大量内存,可能导致内存不足的问题。
Stream 是用于处理数据流的一种方式,它将数据分块处理,适合处理大数据集或持续不断的数据流。例如,从网络中读取数据、处理大型文件等。
特点
分块处理:数据被分成小块逐步处理,而不是一次性加载到内存中。
低内存占用:适合处理大数据集,不会占用大量内存。
延迟处理:数据可以一边读取一边处理适合实时处理,如视频流。
流读取到的也是Buffer 二进制(字节)数组,为了便于阅读和调试,Buffer 通常会以十六进制形式显示其内容。但这只是表示形式,底层存储仍然是二进制数据。展开赞过32 - @supports 是 CSS 中的一个条件规则,用于检测当前浏览器是否支持某些 CSS 属性和值。它的语法如下:
@supports (条件) {
/* 支持情况下应用的 CSS 规则 */
}
@supports not (条件) {
/* 不支持情况下应用的 CSS 规则 */
}
其中,条件部分可以是任何合法的 CSS 属性或属性值,浏览器会根据是否支持这些属性或值来决定应用哪一部分的 CSS 规则。
/* 如果浏览器支持 display: grid 则应用下面的规则 */
@supports (display: grid) {
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
}
/* 如果浏览器不支持 backdrop-filter 则应用下面的规则 */
@supports not (backdrop-filter: blur(10px)) {
.modal {
background-color: rgba(0, 0, 0, 0.5);
}
}展开评论点赞 - ## shell 脚本的终止与继续执行
在Shell脚本中,可以使用&&和||来根据前一个命令的执行结果来决定是否执行后续的命令。如果前一个命令成功执行(返回退出码为0),则执行后续的命令,否则停止执行。
a && b ,a执行成功才执行b
a || b ,a执行失败也执行b展开等人赞过评论4