当前位置: 首页 > article >正文

解锁二进制数组:JS、TS、ArkTS 解析

二进制数组基础入门

在编程的世界里,二进制数组就像是一把隐藏的钥匙,虽然不常被提及,但却在许多关键领域发挥着至关重要的作用。从计算机的底层硬件到前端的高性能计算,二进制数组都有着广泛的应用。

在计算机科学中,二进制是数据存储和处理的基础。二进制数组则是一种特殊的数据结构,它允许我们以数组的形式直接操作二进制数据。这在处理大量数据时,能够大大提高效率和性能。比如在 WebGL 中,二进制数组用于向 GPU 传输顶点数据,使得图形渲染更加流畅;在音频处理中,它可以高效地访问和处理音频样本数据;在网络通信中,二进制数组能够实现更快速的数据传输。

对于 JavaScript、TypeScript 和 ArkTS 开发者来说,掌握二进制数组的使用,不仅能够提升我们对语言底层的理解,还能让我们在处理复杂数据时更加得心应手。无论是优化代码性能,还是实现一些高级功能,二进制数组都能成为我们的得力助手。接下来,让我们一起深入探索二进制数组的奥秘,看看它在这三种语言中是如何发挥作用的。

JS 中的二进制数组

(一)ArrayBuffer:内存基石

在 JavaScript 中,ArrayBuffer对象代表内存中一段固定长度的二进制数据缓冲区。它就像是一块原始的内存空间,为存储二进制数据提供了基础。你可以把它想象成一个仓库,里面存放着各种二进制数据,但这个仓库本身并没有提供直接操作这些数据的方法。

ArrayBuffer的构造函数允许我们分配指定字节大小的内存区域。例如,const buffer = new ArrayBuffer(16); 这行代码创建了一个大小为 16 字节的ArrayBuffer,就像是开辟了一个 16 平方米的仓库空间,每个字节的初始值都为 0。

ArrayBuffer有一些重要的属性,比如byteLength属性,它返回ArrayBuffer所占据的内存字节长度。在上面的例子中,buffer.byteLength 的值就是 16。虽然ArrayBuffer不能直接读写数据,但它提供了slice方法,用于创建一个新的ArrayBuffer,其内容是原ArrayBuffer中指定字节范围的副本。比如,const newBuffer = buffer.slice(0, 8); 会创建一个新的ArrayBuffer,包含原buffer前 8 个字节的数据。

(二)TypedArray 视图:数据解析利器

TypedArray并不是一个单一的构造函数,而是一组构造函数,它为ArrayBuffer提供了一种视图,让我们可以以特定的数据类型来解读和操作ArrayBuffer中的数据。就好比给仓库里的货物贴上了不同的标签,告诉我们如何去理解和使用这些货物。

TypedArray一共有 9 种不同的视图类型,每种类型都对应一种特定的数据类型和字节长度。例如:

  • Int8Array:8 位有符号整数,每个元素占 1 个字节,取值范围是 -128 到 127。
  • Uint8Array:8 位无符号整数,每个元素占 1 个字节,取值范围是 0 到 255。
  • Int16Array:16 位有符号整数,每个元素占 2 个字节,取值范围是 -32768 到 32767。
  • Uint16Array:16 位无符号整数,每个元素占 2 个字节,取值范围是 0 到 65535。
  • Int32Array:32 位有符号整数,每个元素占 4 个字节,取值范围是 -2147483648 到 2147483647。
  • Uint32Array:32 位无符号整数,每个元素占 4 个字节,取值范围是 0 到 4294967295。
  • Float32Array:32 位浮点数,每个元素占 4 个字节,用于表示小数。
  • Float64Array:64 位浮点数,每个元素占 8 个字节,能表示更大范围和更高精度的小数。
  • Uint8ClampedArray:8 位无符号整数,每个元素占 1 个字节,与Uint8Array不同的是,它在处理溢出时会将值钳制在 0 到 255 之间 。

TypedArray的构造函数有多种用法。我们可以通过已有的ArrayBuffer来创建,比如:

const buffer = new ArrayBuffer(8);
const int8Array = new Int8Array(buffer);

这里创建了一个基于buffer的Int8Array视图,这样就可以通过int8Array来操作buffer中的数据了。

也可以直接指定长度来创建,此时会自动分配一个对应的ArrayBuffer:

const uint16Array = new Uint16Array(4);

这行代码创建了一个长度为 4 的Uint16Array,底层会分配一个大小为 8 字节(因为每个Uint16Array元素占 2 个字节)的ArrayBuffer。

还可以通过其他TypedArray实例或类数组对象来创建:

const sourceArray = new Uint8Array([1, 2, 3, 4]);
const targetArray = new Int16Array(sourceArray);const arrayLike = [10, 20, 30];
const newArray = new Uint32Array(arrayLike);

TypedArray和普通数组在一些方面存在差异。普通数组的元素类型可以是任意的 JavaScript 值,而TypedArray的所有成员都是同一种类型。TypedArray的成员在内存中是连续存储的,不会有空位,而普通数组可能存在稀疏的情况。此外,TypedArray数组成员的默认值是 0,普通数组则没有这样的默认值设定。

TypedArray还具有一些特有属性,比如BYTES_PER_ELEMENT属性表示每个元素所占用的字节数,buffer属性返回其底层的ArrayBuffer对象,byteLength属性返回视图占据的内存长度,byteOffset属性表示视图从底层ArrayBuffer对象的哪个字节开始,length属性表示视图中的元素个数。

在方法方面,TypedArray实现了数组接口,所以可以使用很多数组的方法,如map、filter、reduce等,同时它还有一些自己特有的方法,如copyWithin可以在数组内部复制元素 。

(三)DataView 视图:灵活的内存访问

DataView视图为我们提供了一种更灵活的方式来访问和操作ArrayBuffer中的数据。与TypedArray不同,DataView可以自定义数据的解析格式和字节序,这使得它在处理复杂二进制数据时非常有用。就像是一个万能的工具,可以根据我们的需求随意调整使用方式。

DataView的构造函数接受一个ArrayBuffer对象作为参数,还可以指定字节偏移量和视图长度。例如:

const buffer = new ArrayBuffer(16);
const dataView = new DataView(buffer, 4, 8);

这里创建了一个从buffer的第 4 个字节开始,长度为 8 个字节的DataView视图。

DataView提供了一系列方法来进行格式化的读写操作。比如getInt8、getUint8、getInt16、getUint16、getInt32、getUint32、getFloat32、getFloat64等方法用于读取不同类型的数据,setInt8、setUint8、setInt16、setUint16、setInt32、setUint32、setFloat32、setFloat64等方法用于写入数据。在读取和写入时,还可以指定字节序(大端序或小端序),以适应不同的系统和数据格式需求。

假设我们有一个包含特定格式二进制数据的ArrayBuffer,前 4 个字节是一个 32 位的无符号整数,接下来 4 个字节是一个 32 位的浮点数。使用DataView就可以这样读取

const buffer = new ArrayBuffer(8);
const dataView = new DataView(buffer);
dataView.setUint32(0, 1234567890);
dataView.setFloat32(4, 3.14159);const uint32Value = dataView.getUint32(0);
const float32Value = dataView.getFloat32(4);
console.log(uint32Value); // 输出 1234567890
console.log(float32Value); // 输出 3.14159

在处理网络协议数据、文件格式解析等场景中,DataView的灵活性就能够充分发挥出来,帮助我们准确地处理各种复杂的二进制数据结构。

TS 中的二进制数组

(一)TS 类型系统中的二进制相关类型

在 TypeScript 中,数字类型可以表示二进制字面量。自 ECMAScript 2015 起,TypeScript 支持二进制字面量,通过在数字前加上0b或0B前缀来表示,如let binaryNumber: number = 0b1010;,这里的binaryNumber就是一个二进制表示的数字,其十进制值为 10。

在 TS 类型系统中,虽然没有专门的 “二进制数组” 类型,但我们可以使用number[]或Uint8Array等类型来表示包含二进制数据的数组。当使用number[]时,数组中的每个元素都是一个数字,这些数字可以用来表示二进制数据的各个位或字节 。例如,let binaryArray: number[] = [1, 0, 1, 1]; 这个数组可以看作是二进制数1011的一种表示形式。

Uint8Array在 TS 中也很常用,它是TypedArray的一种,专门用于处理 8 位无符号整数,非常适合表示二进制数据。通过类型注解,我们可以明确变量是Uint8Array类型,如let byteArray: Uint8Array = new Uint8Array([0x41, 0x42, 0x43]);,这里byteArray就是一个Uint8Array类型的数组,包含了三个字节的数据,分别对应字符'A'、'B'、'C'的 ASCII 码。

在类型推断方面,TS 会根据变量的赋值情况自动推断其类型。如果我们创建一个数组并赋值为二进制字面量,TS 会将其推断为number[]类型。比如let arr = [0b10, 0b11];,TS 会推断arr的类型为number[]。在使用TypedArray时,如果通过构造函数创建并传入合适的参数,TS 也能正确推断出其类型。

(二)TS 操作二进制数组的实践

在实际应用中,TypeScript 操作二进制数组的场景很多。以 LeetCode 1356 根据数字二进制下 1 的数目排序为例,题目要求我们对整数数组按照其二进制表示中数字 1 的数目升序排序,如果存在多个数字二进制中 1 的数目相同,则按数值大小升序排列。

function onesCount(x: number): number {let c = 0;while (x > 0) {c += x % 2;x = Math.floor(x / 2);}return c;
}function sortByBits(arr: number[]): number[] {arr.sort((a, b) => {const cx = onesCount(a);const cy = onesCount(b);if (cx === cy) {return a - b;}return cx - cy;});return arr;
}// 测试
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];
console.log(sortByBits(arr)); 

在这段代码中,onesCount函数用于计算一个数字二进制表示中 1 的个数。通过不断对数字进行取模和除法运算,判断每一位是否为 1 并累加计数。sortByBits函数则利用Array.prototype.sort方法对数组进行排序,在排序比较函数中,先比较两个数字二进制中 1 的个数,如果相同再比较数字本身的大小 。

还有一种递推预处理的方法来解决这个问题:

function sortByBits(arr: number[]): number[] {// 计算每个数的二进制中1 的个数const bit: number[] = new Array(10001).fill(0);for (let i = 1; i <= 10000; ++i) {bit[i] = bit[i >> 1] + (i & 1);}// 深拷贝数组以避免原地修改const sortedArr = [...arr];// 使用自定义排序函数进行排序sortedArr.sort((x, y) => {if (bit[x] < bit[y]) {return -1;}if (bit[x] > bit[y]) {return 1;}return x - y;});return sortedArr;
}

这里先通过递推的方式预处理出每个数二进制中 1 的个数,存储在bit数组中。然后对原数组进行深拷贝,在排序时直接利用bit数组中的值进行比较,这样可以提高排序的效率 。在实际应用中,我们可以根据具体需求选择合适的方法来操作二进制数组,以实现高效的数据处理。

ArkTS 中的二进制数组

(一)ArkTS 的 TypedArray 与相关概念

在 ArkTS 中,TypedArray是处理二进制数据的关键工具。它是一种类数组数据视图,用于描述二进制数据,可看作是指定元素类型的数组 。TypedArray本身没有直接构造器,但可以通过它的子类构造器来创建相应类型的数据。

TypedArray的子类丰富多样,包括Int8Array(8 位有符号整数数组)、Uint8Array(8 位无符号整数数组)、Uint8ClampedArray(8 位无符号整数数组,溢出时会钳制值)、Int16Array(16 位有符号整数数组)、Int32Array(32 位有符号整数数组)等 。这些不同类型的数组视图,为开发者提供了灵活处理二进制数据的能力。

TypedArray具有一些显著特性。它是定长数组,长度在创建时就已确定,无法像普通数组那样动态调整长度,这在某些对内存和性能要求严格的场景中非常重要。TypedArray在处理二进制数据方面效率极高,特别适用于处理图像、音频等需要直接操作二进制数据的场景 。通过不同的视图类型,开发者可以根据数据的实际表示方式,选择最合适的数组类型来读取和操作内存数据,提高数据处理的准确性和效率。

例如,在处理图像数据时,图像的像素信息通常以二进制形式存储,使用Uint8Array可以直接读取和修改每个像素的颜色值,因为每个像素的颜色通道(如 RGB)通常可以用 8 位无符号整数来表示。在音频处理中,音频样本数据也可以用Int16Array等类型来存储和处理,以适应音频数据的特点 。

(二)ArkTS 二进制数组的应用场景

在鸿蒙开发中,ArkTS 二进制数组有着广泛的应用场景。在图像和视频处理领域,图像和视频数据本质上都是二进制数据。例如,在处理图像的像素数据时,我们可以使用Uint8Array来存储和操作每个像素的颜色值。假设我们要对一张图片进行灰度化处理,就可以通过Uint8Array读取每个像素的 RGB 值,然后根据灰度化算法将其转换为灰度值,再写回Uint8Array中,从而实现图像的灰度化。

在音频处理场景中,ArkTS 二进制数组同样发挥着重要作用。音频数据通常以采样的形式存储,每个采样点都代表了某一时刻的音频信号值。通过Int16Array等类型的二进制数组,我们可以方便地读取、修改和处理这些音频采样数据。比如,实现音频的降噪功能,就可以通过对二进制数组中的音频数据进行分析和处理,去除噪声部分,从而提高音频的质量 。

在网络通信方面,当我们进行数据传输时,数据往往以二进制的形式在网络中传输。ArkTS 中的二进制数组可以用于高效地处理这些网络数据。例如,在开发一个基于 WebSocket 的聊天应用时,接收到的消息数据可能是二进制格式的,我们可以使用Uint8Array等将其解析为文本或其他数据类型,然后进行相应的处理,再将处理后的回复数据转换为二进制数组发送出去 。在物联网设备开发中,与设备之间的通信数据也常常需要使用二进制数组来处理,以确保数据的准确传输和高效处理。

对比与总结

(一)JS、TS、ArkTS 二进制数组的异同

在语法层面,JavaScript 通过ArrayBuffer、TypedArray和DataView来操作二进制数组,语法较为灵活,开发者可以根据具体需求选择合适的方式。ArrayBuffer创建内存缓冲区,TypedArray提供不同数据类型的视图,DataView则实现更灵活的读写操作 。TypeScript 在 JS 的基础上,增加了类型注解,使得代码在操作二进制数组时类型更加明确。比如使用Uint8Array时,可以明确变量的类型为Uint8Array,避免类型错误 。ArkTS 的TypedArray同样用于处理二进制数据,虽然没有直接构造器,但通过子类构造器创建相应类型数据的方式,也具有独特的语法特点。

从功能角度来看,三者都提供了操作二进制数据的能力。JavaScript 的二进制数组功能全面,能满足各种常见的二进制数据处理需求,无论是简单的数据存储还是复杂的网络协议解析 。TypeScript 继承了 JavaScript 的二进制数组功能,并且借助其类型系统,增强了代码的健壮性和可维护性。在处理二进制数组时,可以在编译阶段发现类型相关的错误,减少运行时的错误发生 。ArkTS 的TypedArray在处理二进制数据时效率较高,尤其适用于处理图像、音频等需要大量二进制数据处理的场景。其定长数组的特性,在内存管理和性能优化方面具有一定优势 。

在应用场景方面,JavaScript 的二进制数组广泛应用于 Web 开发的各个领域。在 WebGL 中用于图形渲染,将顶点数据以二进制数组的形式传输给 GPU,实现高效的图形绘制;在音频处理中,能够快速处理音频样本数据,实现音频的播放、录制和编辑等功能 。TypeScript 由于其类型安全的特性,在大型项目和对代码质量要求较高的场景中更受欢迎。在开发复杂的前端应用时,使用 TypeScript 操作二进制数组可以提高代码的可读性和可维护性,方便团队协作开发 。ArkTS 的二进制数组主要应用于鸿蒙开发中,在图像、视频、音频处理以及网络通信等方面发挥重要作用。在鸿蒙系统的应用开发中,处理图像的像素数据、音频的采样数据以及网络传输的数据时,ArkTS 的二进制数组能够提供高效的解决方案 。

(二)实际应用中的选择与建议

如果是进行 Web 前端开发,且项目规模较小,对开发速度要求较高,JavaScript 的二进制数组是一个不错的选择。其灵活的语法和广泛的浏览器支持,可以快速实现二进制数据的处理功能。在一些简单的网页特效开发中,使用 JavaScript 操作二进制数组来处理图像数据,能够快速实现特效效果 。

当项目规模较大,需要更严格的类型检查和代码规范时,TypeScript 则更为合适。在企业级 Web 应用开发中,使用 TypeScript 操作二进制数组,可以在开发过程中及时发现类型错误,提高代码的稳定性和可维护性 。

对于鸿蒙应用开发,ArkTS 是首选语言,其TypedArray能够很好地适应鸿蒙系统的开发需求。在开发鸿蒙系统的图像编辑应用时,使用 ArkTS 的Uint8Array来处理图像的像素数据,能够充分利用其高效性和对鸿蒙系统的适配性 。

在实际应用中,还需要考虑团队的技术栈和项目的具体需求。如果团队对 JavaScript 或 TypeScript 比较熟悉,且项目是跨平台的 Web 应用,那么可以优先考虑 JavaScript 或 TypeScript;如果是专注于鸿蒙系统的应用开发,且团队有相关开发经验,那么 ArkTS 将是最佳选择 。同时,随着技术的不断发展,不同语言和框架之间的融合也越来越紧密,开发者可以根据实际情况灵活运用各种技术,以实现最佳的开发效果 。

相关文章:

解锁二进制数组:JS、TS、ArkTS 解析

二进制数组基础入门 在编程的世界里&#xff0c;二进制数组就像是一把隐藏的钥匙&#xff0c;虽然不常被提及&#xff0c;但却在许多关键领域发挥着至关重要的作用。从计算机的底层硬件到前端的高性能计算&#xff0c;二进制数组都有着广泛的应用。 在计算机科学中&#xff0…...

C# windowForms 的DataGridView控件的使用

C# Windows Forms DataGridView 控件使用详解 DataGridView 是 Windows Forms 中用于显示和编辑表格数据的核心控件。它支持高度自定义的列类型、数据绑定、事件处理和丰富的样式配置。以下是其详细使用方法。 目录 基础使用 数据绑定 列类型与自定义...

深度求索—DeepSeek API的简单调用(Java)

DeepSeek简介 DeepSeek&#xff08;深度求索&#xff09;是由中国人工智能公司深度求索&#xff08;DeepSeek Inc.&#xff09;研发的大规模语言模型&#xff08;LLM&#xff09;&#xff0c;专注于提供高效、智能的自然语言处理能力&#xff0c;支持多种场景下的文本生成、对…...

企业使用统一终端管理(UEM)工具提高端点安全性

什么是统一终端管理(UEM) 统一终端管理(UEM)是一种从单个控制台管理和保护企业中所有端点的方法&#xff0c;包括智能手机、平板电脑、笔记本电脑、台式机和 IoT设备。UEM 解决方案为 IT 管理员提供了一个集中式平台&#xff0c;用于跨所有作系统和设备类型部署、配置、管理和…...

Vue.js 响应式原理与数据绑定

在 Vue.js 中&#xff0c;响应式系统是其核心特性之一&#xff0c;它使得数据的变化能够自动更新到 DOM 上&#xff0c;实现了数据和视图的双向绑定。下面详细介绍 Vue.js 响应式系统的原理以及它是如何实现数据绑定的。 原理概述 Vue.js 的响应式系统主要基于 JavaScript 的…...

爱彼(Audemars Piguet):瑞士制表艺术的巅峰之作(中英双语)

爱彼&#xff08;Audemars Piguet&#xff09;&#xff1a;瑞士制表艺术的巅峰之作 在瑞士高级制表界&#xff0c;Audemars Piguet&#xff08;爱彼&#xff09; 以其大胆创新、卓越工艺和独立家族经营的传统&#xff0c;成为世界顶级腕表品牌之一。作为瑞士“三大制表品牌”之…...

深入理解Elasticsearch集群与分片:原理及配置方案

一、Elasticsearch集群是什么 想象一下&#xff0c;你有海量的数据&#xff0c;比如一个超大型图书馆的所有书籍信息&#xff0c;要是把这些数据都放在一台电脑里&#xff0c;不仅存不下&#xff0c;而且查询起来会超级慢。Elasticsearch集群就像是一个分布式的数据图书馆系统…...

1134. 国王的魔镜

题目 AC代码 #include<bits/stdc.h> using namespace std; bool hw(char s[]) {bool rtrue;int i;for(i0;i<strlen(s)/2;i){if(s[i]!s[strlen(s)-i-1]){rfalse;break;}}return r; } int main() {char s[1005];gets(s);while(hw(s)true&&strlen(s)%20){s[strl…...

【20250215】二叉树:144.二叉树的前序遍历

# 前序遍历-递归-LC144_二叉树的前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right # class Solution: # def pre…...

浅说树形dp

文章目录 前言树形dp的转移方式树形dp的使用的场景小结 初步感知——简单的树形dp例题1例题2 深入分析——树形dp的经典模型最大独立集最小点覆盖最小支配集树上直径 前言 因为树的形式非常适合递归&#xff0c;他所带来的访问顺序也是非常符合拓扑排序的&#xff0c;故而在处…...

DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解

DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解全集&#xff1a; 第一部分&#xff1a;Windows本地部署DeepSeek R1 第二部分&#xff1a;Macos本地部署DeepSeek R1 第三部分&#xff1a;Linux本地部署DeepSeek R1 第四部分&#xff1a;DeepSeek …...

使用Charles进行mock请求

在 Charles 中&#xff0c;“Compose”&#xff08;构建请求&#xff09;功能允许你手动创建和发送 HTTP 或 HTTPS 请求&#xff0c;方便进行 API 测试、调试等操作。以下是 Compose 功能的详细使用方式&#xff1a; 1. 打开 Compose 界面 启动 Charles 后&#xff0c;在菜单…...

linu软件编程——IO

函数接口 fputc&#xff1a; man 3 fputc 原型&#xff1a;int fputc(int c, FILE *stream); 功能: 向stream流中写入 字符c 参数&#xff1a;c:要写入的字符的ASCII码值 stream:文件流指针 返回值&#xff1a;成功返回写入字符的ASCII码值 失败返回-1 fputc(ch, stdout) put…...

RAMinit 程序编译运行考古记录

本科的时候浅浅研究了DOSBox&#xff0c;今天看到网上挺多关于雷军代码的新闻&#xff0c;我把雷军代码在web上编译出来了&#xff0c;但是我是业余选手&#xff0c;所以做得比较差&#xff0c;不过大家感兴趣可以关注我的dosplay项目&#xff0c;旨在利用js-dos实现汇编语言在…...

2.【线性代数】——矩阵消元

二 矩阵消元 1. 消元法2. 单行或者单列的矩阵乘法2.1 单行矩阵乘法2.2 单列矩阵乘法 3. 用矩阵记录消元过程&#xff08;初等矩阵&#xff09; 【行的线性组合&#xff08;数乘和加法&#xff09;】3.1 row2-3row1的矩阵描述3.2 row3-2row2的矩阵描述3.3 矩阵乘法的性质 4. 用矩…...

Vue 3 30天精进之旅:Day 25 - PWA支持

一、引言 在前面的24天中&#xff0c;我们已经深入探讨了Vue 3的许多核心概念和高级特性。今天&#xff0c;我们将进入一个全新的领域——PWA&#xff08;Progressive Web App&#xff09;。PWA是一种现代Web应用程序的开发模式&#xff0c;它结合了Web和原生应用的优点&#…...

【Pico】使用Pico进行无线串流搜索不到电脑

使用Pico进行无线串流搜索不到电脑 官串方式&#xff1a;使用Pico互联连接电脑。 故障排查 以下来自官方文档 请按照以下步骡排除故障&#xff1a; 确认电脑和一体机连接了相同的路由器WiFi网络(相同网段) IP地址通常为192.168.XX&#xff0c;若两设备的IP地址前三段相同&…...

Golang Model 字段自动化校验设计

背景 在我们日常开发中&#xff0c;不可避免的总要去进行各种参数校验&#xff0c;但是如果在某个场景中&#xff0c;要校验的字段非常多&#xff0c;并且在其中还有耦合关系&#xff0c;那么我们手写校验逻辑就变得非常的低效且难以维护。本篇文档就基于 DDD 领域模型设计的思…...

移动端测试的挑战与解决方案:兼容性、网络问题及实战策略

引言 移动应用已成为用户触达服务的核心入口,但移动端测试面临设备多样性、网络波动、用户场景复杂等多重挑战。据Statista统计,2023年全球活跃移动设备超180亿台,操作系统(Android/iOS)版本碎片化率超30%,这对测试工程师提出了极高要求。本文深度解析移动端测试的核心痛…...

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...

如何使用Three.js制作3D月球与星空效果

目录 1. 基本设置2. 创建星空效果3. 创建月球模型4. 添加中文3D文字5. 光照与相机配置6. 动画与控制7. 响应式布局8. 结语 在本文中&#xff0c;我们将一起学习如何利用Three.js实现一个3D月球与星空的效果&#xff0c;并添加一些有趣的元素&#xff0c;比如中文3D文字和互动功…...

Spring安装和使用(Eclipse环境)

一、Spring框架概述 1、 什么是Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复…...

网络安全-攻击流程-传输层

传输层攻击主要针对OSI模型的第四层&#xff0c;涉及TCP和UDP协议的安全漏洞。以下是常见攻击类型及其流程&#xff0c;以及防御措施&#xff1a; 1. SYN洪水攻击&#xff08;TCP半连接攻击&#xff09; 攻击流程&#xff1a; 目标选择&#xff1a;确定目标服务器的IP地址和开…...

图论- Dijkstra算法

Dijkstra算法 前言概念BFS基础模版DijkstraDijkstra函数签名State类distTo 记录最短路径伪代码模版第一个问题解答第二个问题解答第三个问题解答 前言 学习这个算法之间,必须要对BFS遍历比较熟悉,它的本质就是一个特殊改造过的BFS算法. 概念 Dijkstra算法是一种计算图中单源…...

CAS单点登录(第7版)9.属性

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 属性 属性定义 概述 属性定义 从身份验证或属性存储库源获取和解析 CAS 中属性的定义时&#xff0c;往往使用其名称进行定义和引用&#xff0c;而无需任何其他元数据或修饰。例如&#…...

一些常用的Yum源

一些常用的Yum源 # CentOS-Stream-AppStream.repo [appstream] nameCentOS Stream $releasever - AppStream baseurlhttps://mirrors4.tuna.tsinghua.edu.cn/centos-vault/8-stream/AppStream/x86_64/os/ gpgcheck0 enabled1# CentOS-Stream-BaseOS.repo [baseos] nameCentOS …...

【电路笔记】-双向计数器

双向计数器 文章目录 双向计数器1、概述2、双向计数器双向计数器能够通过任何给定的计数序列向上或向下方向计数。 1、概述 双向计数器是同步向上/向下二进制计数器,能够在两个方向上向或从某个预设值以及零进行计数。 除了从零开始“向上”计数并增加或递增到某个预设值之外…...

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网&#xff0c;https://www.deepseek.com/ 点击左侧“API Keys”&#xff0c;创建API key&#xff0c;输出名称为“AI” 点击“创建"&#xff0c;将API key保存&#xff0c;复制在其它地方。 在PyCharm中下…...

LeetCode 232: 用栈实现队列

LeetCode 232: 用栈实现队列 题目描述 使用栈实现队列的操作。支持以下操作&#xff1a; MyQueue()&#xff1a;初始化队列。push(x)&#xff1a;将元素 x 推入队列。pop()&#xff1a;从队列中移除元素。peek()&#xff1a;返回队列头部的元素。empty()&#xff1a;检查队列…...

P6792 [SNOI2020] 区间和 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作分两种&#xff1a; chmax ⁡ ( l , r , v ) \operatorname{chmax}(l,r,v) chmax(l,r,v)&#xff1a;对每个 i ∈ [ l , r ] i \in [l,r] i∈[l,…...