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

鸿蒙技术分享:鸿蒙元服务踩坑血泪:文件下载、选择、打开

鸿蒙元服务踩坑:文件下载、选择、打开

因为项目有开发元服务的需求,因此需要将原本给应用开发封装的文件操作相关代码拿到元服务里用。
本以为也没很复杂的功能,直接用应该问题不大,结果还是踩了坑……

原本给应用使用的代码请查看:鸿蒙应用开发:文件下载、选择、打开

文件下载

之前讲文件下载选择下载地址时,有个重点:

2. 核心在于获取公共目录地址;按照官方文档,要使用`DocumentViewPicker.save()`方法,而其返回值是**FileUri格式的字符串**;例如:`file://docs/storage/Users/currentUser/Download/component-Library.zip`;
3. 而`@ohos.file.fs`库中,大部分方法都是要求传入`path`格式的字符串;因此需要使用`FileUri`类进行解析后获得`path`;例如:`/storage/Users/currentUser/Download/component-Library.zip`;

这一整套逻辑在Application开发时没有任何问题。

但是在开发元服务时就遇到了问题,原因是FileUri不支持元服务。

declare namespace fileUri {/*** FileUri represents the uri of the file.** @extends uri.URI* @syscap SystemCapability.FileManagement.AppFileService* @since 10*/class FileUri extends uri.URI {/*** Constructor for obtaining the instance of the FileUri class.** @param { string } uriOrPath - Uri or Path.* @syscap SystemCapability.FileManagement.AppFileService* @since 10*/constructor(uriOrPath: string);}
}

是否可以不进行FileUri解析?

遇到该问题的第一反应就是,在使用FileUri解析之前只是个字符串。如果不能解析那么是否可以直接用fileUri格式的字符串进行相关文件操作呢?

在整个过程中用到了如下方法:

/**** Access file with sync interface.** @param { string } path - path.* @param { AccessModeType } [mode = fs.AccessModeType.EXIST] - accessibility mode.* @returns { boolean } Returns the file is accessible or not.* @syscap SystemCapability.FileManagement.File.FileIO* @crossplatform* @atomicservice* @since 12*/
declare function accessSync(path: string, mode?: AccessModeType): boolean;

经过测试file://docs/storage/Users/currentUser/Download/component-Library.zip格式字符串在使用accessSync判断时会报错Operation not permitted😭。

然后转而尝试使用statSync

/*** Get file information with sync interface.** @param { string | number } file - path or file descriptor.* @returns { Stat } Returns the Stat object.* @syscap SystemCapability.FileManagement.File.FileIO* @crossplatform* @atomicservice* @since 11*/
declare function statSync(file: string | number): Stat;

测试发现还是报错😭😭。

最后尝试openSync,想通过是否可以正常打开文件来判断。

/*** Open file with sync interface.** @param { string } path - path.* @param { number } [mode = OpenMode.READ_ONLY] - mode.* @returns { File } Returns the File object to record the file descriptor.* @throws { BusinessError } 13900001 - Operation not permitted* @syscap SystemCapability.FileManagement.File.FileIO* @crossplatform* @atomicservice* @since 11*/
declare function openSync(path: string, mode?: number): File;

实测file://docs/storage/Users/currentUser/Download/component-Library.zip格式字符串的可以正常使用。😄😄😄

正在我验证方案成功,开心地修改代码并自测的时候,问题又出现了……

openSync的第二个参数是打开模式:打开文件的选项,必须指定如下选项中的一个,默认以只读方式打开:

openSync来替代accessSync判断文件是否存在,用默认的只读方式打开就可以了。使用也正常。

但是当真实下载文件时,需要创建新文件并写入ArrayBuffer,这个时候就要用到fs.OpenMode.CREATE创建模式。
该模式对于fileUri格式字符串支持有坑,测试结果如下:

当pickerMode为DOWNLOAD,fs.openSync入参为uri格式字符串,OpenMode是CREATE(新下载时,文件不存在);fs.openSync会报operation not permitted错误。  其他情况:  
1.当pickerMode为DOWNLOAD,fs.openSync入参为**path格式字符串**,OpenMode是CREATE(新下载时,文件不存在);运行正常;  
2.当pickerMode为DOWNLOAD,fs.openSync入参为uri格式字符串,**OpenMode是WRITE_ONLY(文件已存在)**;运行正常;  
3.当**pickerMode为DEAULT**,fs.openSync入参为uri格式字符串,OpenMode是CREATE(新下载时,文件不存在);运行正常;  该问题本身和应用或元服务无关,只是`fs.openSync`的bug。  

😭😭😭此路不通

其他替代方案

在将以上问题反馈给官方技术支持后,又继续考虑其他方案。

declare namespace fileUri {/*** FileUri represents the uri of the file.** @extends uri.URI* @syscap SystemCapability.FileManagement.AppFileService* @since 10*/class FileUri extends uri.URI {/*** Constructor for obtaining the instance of the FileUri class.** @param { string } uriOrPath - Uri or Path.* @syscap SystemCapability.FileManagement.AppFileService* @since 10*/constructor(uriOrPath: string);}
}

FileUri的定义是继承自uri.URI,点进去发现:

    /*** URI Represents a Uniform Resource Identifier (URI) reference.** @syscap SystemCapability.Utils.Lang* @crossplatform* @atomicservice* @since 11* @name URI*/class URI {}

@atomicservice标注,支持元服务。
一时间豁然开朗,因为FileUri的Path解析能力是继承自uri.URI,经过测试后发现功能正常。

因此最终,该方法中也只是将let uri = new fileUri.FileUri(documentSaveResult[0]);替换为let uriObj = new uri.URI(documentSaveResult[0]);

文件选择

文件选择功能除了解析path,还获取了文件名,不过文件名解析相对简单,即便手动解析问题也不大。

  let uri = new fileUri.FileUri(documentSelectResult[0]);if (options.success != undefined) {options.success({'path': uri.path,'name': uri.name})}

最终修改为:

  let uriObj = new uri.URI(documentSelectResult[0]);if (options.success != undefined) {options.success({'path': uriObj.path,'name': uriObj.getLastSegment()})}

文件打开

    let filePath = options.fileName;// 将沙箱路径转换为urilet uri = fileUri.getUriFromPath(filePath);let want: Want  = {// 配置被分享文件的读写权限,例如对被分享应用进行读写授权flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,// 配置分享应用的隐式拉起规则action: 'ohos.want.action.sendData',uri: uri,type: options.contentType}

文件打开的问题就很大了,经过测试Want中的uri参数必须是uri格式,使用path格式调用无效。

解决该问题有两个方向:

业务向

因为文件打开的前一步一般是获取文件目录地址;而文件目录地址无论是通过picker.select()选择还是picker.save()下载,其原始返回值都是uri格式,因此可以缓存uri格式字符串用于打开。

这样代码中的let uri = fileUri.getUriFromPath(filePath);就不在需要了。

不过这里存在一些picker的风险点:

从FilePicker返回的图片地址uri是不是只是在一定的时间内有访问权限

重启应用后,uri失效是正常的,因为通过picker生成uri的同时系统会对uri有临时授权,应用被杀掉后该临时授权失效,需要重新通过picker选择来生成uri。

刚需

如果上面方案无法解决,而元服务里,这个功能又是刚需,非做不可,只能考虑参照官方文档文档类uri介绍,手动进行格式转换。

手动转换的话,功能当然也不是不能用,担忧在于鸿蒙是新系统,现在又是beta阶段,这些格式存在频繁变动的可能。

所以在最开始解决该问题时也没有第一时间想着手动处理。

总结

因为对于HarmonyOS而言,元服务不是前期交付的重点,所以坑也比应用开发多。
不过最近时间元服务相关的修复和变动也挺频繁,如果是在做元服务开发,尽量保持使用最新的beta版本,以免浪费时间在官方已解决的问题上。

相关文章:

鸿蒙技术分享:鸿蒙元服务踩坑血泪:文件下载、选择、打开

鸿蒙元服务踩坑:文件下载、选择、打开 因为项目有开发元服务的需求,因此需要将原本给应用开发封装的文件操作相关代码拿到元服务里用。本以为也没很复杂的功能,直接用应该问题不大,结果还是踩了坑…… 原本给应用使用的代码请查…...

12月通信基础知识补充2

看文献过程中不断发现有太多不懂的基础知识,故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关,故记录不会很深入请见谅。 【通信基础知识补充6】12月通信基础知识补充2 一、Walsh码1.1 Walsh码的基本特性1.2 …...

佑驾创新冲刺上市:交付进度延后,研发投入缩减,刘国清为实控人

近日,深圳佑驾创新科技股份有限公司(MINIEYE,下称“佑驾创新”)通过港交所聆讯并披露了聆讯后资料集(即招股书)。据贝多财经了解,佑驾创新获得了IPO备案通知书,拟在港交所上市。 对…...

【Linux系列】Linux 防火墙的详细学习

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用 Trace 实现 onnx 的导出 - 学习记录

使用 Trace 实现 onnx 的导出 一、使用 Trace 实现 onnx 的导出的流程二、代码分解2.1、定义模型2.2、分析模型操作类型2.3、构建钩子函数2.3.1、定义 hook 函数2.3.2、注册 Conv2d - hook 函数2.3.3、注册 ReLU - hook 函数2.3.4、注册 Add - hook 函数三、完整导出 onnx 代码…...

python字符串处理基础操作总结

1.去掉空格或者特殊符号 input_str.strip() #去掉所有空格 input_str.lstrip() #去掉左边空格 input_str.rstrip() #去掉右边空格 def print_hi():input_str 今天天气不错,风和日丽 out input_str.strip()print(input_str)print(out)if __name__ __main__:print…...

AI如何让PPT制作变得轻松与智能?用一键生成ppt!

谁还愿意把时间浪费在PPT的设计和内容排版上?尤其是对于那些需要频繁制作演示文稿的人来说,一份看起来专业的PPT往往会让人陷入“做与不做”的困境。但随着科技的飞速发展,传统的PPT制作方法正逐渐被更为高效的工具所取代,尤其是智…...

OpenCV相机标定与3D重建(11)机器人世界手眼标定函数calibrateRobotWorldHandEye()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算机器人世界/手眼标定: w T b _{}^{w}\textrm{T}_b w​Tb​ 和 c T g _{}^{c}\textrm{T}_g c​Tg​。 cv::calibrateRobotWorldHa…...

vscode通过ssh连接虚拟机进行开发

虚拟机自带的vscode很卡而且画质感觉不行,所以用这种方法解决 1.VSCODE安装扩展Tabnine(AI代码补全),Remote Development 2.虚拟机终端ifconfig查看本机ip 192.168.43.197 开启ubuntu的SSH服务 sudo apt-get install openssh-server 配置vscode的ssh …...

TCP/IP协议详解(小白)

TCP/IP协议详解 TCP/IP协议包含了一系列的协议,也叫TCP/IP协议族(TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。TCP/IP协议族提供了点对点的连结机制,并且将传输数据帧的封装、寻址、传输、路由…...

手机租赁系统开发全面解析与实现指南

内容概要 手机租赁系统的设计理念是为了满足用户对便捷、灵活的手机使用需求。想象一下,谁还愿意花大价钱买一部手机呢?尤其是当新款手机频繁推出时,租赁似乎成了更受欢迎的选择。这个系统旨在让用户可以随时随地选择租用不同型号的手机&…...

洛谷【排序】算法的题单 - 笔记

2024-12-09 - 第 37 篇 洛谷【排序】题单 - 笔记 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 洛谷【排序】题单合集 一、排序算法都有… 1. 简单排序算法 这些算法通常是基础的排序方法,容易理解和实现,但效率较低,适用于数据量较小的情况…...

《筑牢网络安全防线:守护数字时代的生命线》

《筑牢网络安全防线:守护数字时代的生命线》 一、网络安全的重要性二、网络安全面临的挑战三、网络安全技术四、网络安全案例分析五、如何加强网络安全防护六、结论 一、网络安全的重要性 网络安全在当今数字化时代的重要性不言而喻,它涵盖了多个关键领…...

VB.net进行CAD二次开发(二)与cad交互

开发过程遇到了一个问题&#xff1a;自制窗口与控件与CAD的交互。 启动类&#xff0c;调用非模式窗口 Imports Autodesk.AutoCAD.Runtime Public Class Class1 //CAD启动界面 <CommandMethod("US")> Public Sub UiStart() Dim myfrom As Form1 New…...

Python函数——函数的返回值定义语法

一、引言 在Python中&#xff0c;函数的返回值是其核心功能之一&#xff0c;它使得函数能够将计算结果传递给调用者&#xff0c;进而推动程序的逻辑和功能实现。理解和掌握函数的返回值语法&#xff0c;不仅能够提高代码的模块化和可读性&#xff0c;还能使程序更加高效和灵活…...

Python 布尔索引筛选数据

Python 布尔索引筛选数据 1. 布尔索引筛选数据1.1. 根据布尔索引对矩阵元素进行赋值1.2. 根据布尔索引对矩阵元素进行赋值1.3. 根据布尔索引对矩阵元素进行赋值 2. logits[logits < values[:, [-1]]] -1000References 1. 布尔索引筛选数据 布尔索引允许通过条件筛选矩阵中…...

mybatis缓存

一级缓存和二级缓存范围不一样 只缓存查询&#xff0c;缓存增删改没有意义 先在mybatis-config.xml加入 <setting name"cacheEnabled"value"true"/> 在mapper.xml中开启二缓存 <!--回收策略为先进先出&#xff0c;每隔60秒刷新一次&#xff0c…...

Linux下的编程

实验7 Linux下的编程 一、实验目的 熟练掌握Linux下Python编程的方法、函数调用方法以及shell编程中的控制结构。 二、实验环境 硬件&#xff1a;PC电脑一台&#xff0c;网络正常。 配置&#xff1a;win10系统&#xff0c;内存大于8G &#xff0c;硬盘500G及以上。 软件&a…...

使用Java创建RabbitMQ消息生产者的详细指南

目录 在现代分布式系统中&#xff0c;消息队列是实现异步通信的重要工具。RabbitMQ作为一种流行的开源消息代理&#xff0c;支持多种消息协议&#xff0c;广泛应用于微服务架构和事件驱动的应用程序中。本文将深入探讨如何使用Java创建RabbitMQ的消息生产者&#xff0c;发送消息…...

笔记本外接显示屏没声音

1、笔记本正常有声音&#xff0c;但是外接显示屏后没有声音了怎么回事呢&#xff1f;原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出&#xff0c;但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法&#xff1a;打开笔记本设置&#xff0c;选择声…...

【Linux】Linux权限管理:文件与目录的全面指南

在Linux系统中&#xff0c;权限管理是确保数据安全的关键。本文将为大家介绍Linux文件与目录的权限管理&#xff0c;帮助你理解如何设置和管理访问权限。无论你是新手还是有经验的用户&#xff0c;这里都将提供实用的技巧和知识&#xff0c;助你更好地掌握Linux环境。让我们一起…...

并发在前端中的应用?

‌并发在前端中的应用主要体现在处理多个请求和优化页面加载速度方面‌。前端并发处理通常涉及在极短时间内发送多个数据请求&#xff0c;例如在页面渲染时同时请求多个数据。通过并发处理&#xff0c;可以显著减少页面加载时间&#xff0c;提升用户体验。 前端并发处理的具体…...

Spring Boot助力,一键解锁招聘全流程信息精细化管理

2系统相关技术 2.1 Java语言介绍 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势和广阔的前景&#…...

沉浸式多用户跟踪解决方案

沉浸式多用户VR跟踪解决方案&#xff0c;支持使用HTC VIVE或Valve Index等消费级虚拟现实头盔在房间内执行大范围多用户跟踪。该解决方案不仅能够跟踪处于坐姿或其他静止用户的头部和控制器&#xff0c;还支持房间内多用户动态跟踪。 通常房间内的跟踪受限于特定的系统能力&…...

“切片赋值”创建列表批量操作“新”方法(Python)

[start:end]切片赋值&#xff0c;扩展了list批量增减元素的操作能力。 (笔记模板由python脚本于2024年12月06日 15:07:56创建&#xff0c;本篇笔记适合研python基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;…...

Linux中-vvv详细输出命令

在 Shell 脚本中&#xff0c;有时会看到某些命令后面加上 -vvv 或类似的选项。这个选项的作用通常与命令的 **调试模式** 或 **详细输出** 相关。不同的命令和工具对于选项的解释和处理方式不同&#xff0c;因此 -vvv 的具体含义取决于它所跟随的命令。 ### 一般来说&#xff…...

获取淘宝商品评论数据的API应用:市场调研|产品更新|用户数据

下面是一段我用item_review&#xff08;获取商品评论数据&#xff09;抓来的商品评论数据&#xff1a; "items": {"total_results": 375,"totalpage": 38,"page_size": 10,"page": "1","item": [{&quo…...

VRRP的知识点总结及实验

1、VRRP VRRP(Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议)既能够实现网关的备份&#xff0c;又能解决多个网关之间互相冲突的问题&#xff0c;从而提高网络可靠性。 2、VRRP技术概述&#xff1a; 通过把几台路由设备联合组成一台虚拟的“路由设备”…...

群控系统服务端开发模式-应用开发-邮件发送工具类

一、邮件发送工具类开发 1、添加框架对应的SDK composer require phpmailer/phpmailer 2、添加工具集 在根目录下extend文件夹下创建Email文件夹&#xff0c;在Email文件夹下添加工具集控制并命名为EmailSender.php <?php /*** 邮件发送工具* User: 龙哥三年风水* Date: …...

pytest 的简单介绍

官方文档&#xff1a;pytest 文档 1. pytest 概述 pytest 是一个功能强大的 Python 测试框架&#xff0c;旨在简化单元测试和功能测试的编写与执行。它不仅支持简单的单元测试&#xff0c;还能进行更复杂的测试&#xff0c;如数据驱动的测试、并发测试等。pytest 支持自动化发…...

【C语言】库函数常见的陷阱与缺陷(2):字符串转化函数

目录 一、atoi 函数 1.1. 功能与用法 1.2. 陷阱与缺陷 1.2.1. 输入验证不足 1.2.2. 溢出问题 1.3 安全替代 1.4. 代码示例 二、atof 函数 2.1. 功能与用法 2.2. 陷阱与缺陷 2.3. 安全使用建议 2.4. 代码示例 三、strtol 函数 3.1. 功能与用法 3.2. 陷阱与缺陷 …...

【LeetCode每日一题】LeetCode 976.三角形的最大周长

LeetCode 976.三角形的最大周长 题目描述 给定一个包含非负整数的数组 nums&#xff0c;其中每个元素表示一个线段的长度。你需要从中选出三个线段&#xff0c;组成一个三角形&#xff0c;使得三角形的周长最大&#xff0c;并返回这个最大周长。如果无法组成三角形&#xff0…...

在 Ubuntu 24 上安装 Redis 7.0.15 并配置允许所有 IP 访问

前提条件 一台运行 Ubuntu 24 的服务器拥有 sudo 权限的用户 步骤一&#xff1a;更新系统包 首先&#xff0c;确保系统包是最新的&#xff0c;以避免潜在的依赖问题。 sudo apt update sudo apt upgrade -y步骤二&#xff1a;安装编译 Redis 所需的依赖 Redis 需要一些编译…...

C# 中的异常处理:构建健壮和可靠的程序

C#中的异常处理&#xff08;Exception Handling&#xff09;。异常处理是编程中非常重要的一部分&#xff0c;它允许开发者优雅地处理程序运行时可能出现的错误或意外情况。通过有效的异常处理&#xff0c;可以使应用程序更加健壮、可靠&#xff0c;并提供更好的用户体验。以下…...

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…...

数据结构 ——数状存储的基本概念

数据结构 ——数状存储的基本概念 一、树状存储基本概念 1、 深度&#xff08;层数&#xff09;&#xff1a;计算一个节点的深度&#xff0c;从根节点算起&#xff08;从1开始计数&#xff09;&#xff0c;到该节点所经过的节点数&#xff08;包括此节点&#xff09;为树的深度…...

【网盘系统】递归删除批量文件、从回收站恢复文件、彻底删除文件

为何需要用到递归&#xff1f; 在网盘系统中&#xff0c;文件的类型分为文件和文件夹两种类型。当我们想要批量删除文件时&#xff0c;不乏其中会包含文件夹&#xff0c;而想要删除这个文件夹&#xff0c;自然其中所包含的文件都要删除&#xff0c;而其中所包含的文件也有可能…...

C++ 列表初始化(initializer_list)

列表初始化(initializer_list) 列表初始化是C中的一种语法特性&#xff0c;引入于C11&#xff0c;用于更简单直观地初始化变量、对象或容器。它使用花括号 {}&#xff0c;提供了更安全的初始化方式&#xff0c;避免了类型窄化转换等潜在错误。 定义 列表初始化是用花括号 {}…...

【Keil】Keil MDK 已经不再提供 ARM Compiler v5

该问题出现在 Keil MDK v5.12 之后 用必应搜索相关问题&#xff0c;发现早已在 ARM community 提了 How can I install Compiler Version 5 for Keil vision 5 回答给出了这个文档 Documentation - Arm Developer 文档提到了 ARM Compiler 5 的下载地址&#xff0c;但是得登录 …...

Knowledge Graph Studio:让知识图谱构建更简单、更智能

一、前言 上周和研究院的同事讨论 2025 年大模型产品规划时&#xff0c;让我产生了一些疑惑和不解&#xff0c;因为从大家交流的规划方向来看&#xff0c;更多的还是集中在Prompt提示词工程&#xff08;包括提示词的管理、测试、评估、调优&#xff09;这一块规划的确实挺细&a…...

【jvm】垃圾判别阶段算法

目录 1. 说明2. 引用计数算法2. 可达性分析算法3. 垃圾判别阶段的过程 1. 说明 1.JVM主要使用两种垃圾判别算法&#xff1a;引用计数算法和可达性分析算法。 2. 引用计数算法 1.原理&#xff1a;为每个对象维护一个引用计数器&#xff0c;每当有地方引用该对象时&#xff0c…...

深入理解Linux进程管理机制

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言 进程是现代操作系统中一个不可或缺的概念&#xff0c;其主要目的在于管理资源、实现并发、提高系统效率&#xff0c;并确保系统的稳定性和安全性。 进程的定义 进程&#xff08;Process&#xff09; 是计算机操作系统中…...

OV2640摄像头模块介绍

目录 一、引言 二、模块概述 三、技术特点 四、工作原理 五、接口类型 六、应用领域 七、使用方法 八、参数设置 九、图像数据处理 十、调试和故障排除 十一、结语 一、引言 在当今的科技时代&#xff0c;图像采集和处理技术在众多领域发挥着至关重要的作用。其中&…...

机器人的动力学前馈控制

机器人前馈技术可加快伺服驱动器内部的误差收敛速度&#xff0c;进而改善机器人的动态响应特性&#xff0c;解决机器人在运动过程中的抖动问题&#xff0c;提升机器人系统的精度和效率。 对于关节型机器人而言&#xff0c;在理想的刚性连接下&#xff0c;若给定每个关节所需要的…...

Python+OpenCV系列:图像的几何变换

Python OpenCV 系列&#xff1a;图像的几何变换 引言 在图像处理领域&#xff0c;几何变换是一个非常重要的操作&#xff0c;它可以改变图像的位置、大小、方向或形状。在计算机视觉中&#xff0c;这些操作对于图像预处理、特征提取和图像增强至关重要。本文将介绍如何利用 …...

IC验证基础知识系列随笔

一、断言 and 和 和 intersect 区别 And 指的是两个序列具有相同的起始点&#xff0c;终点可以不同。 Intersect 指的是两个序列具有相同的起始点和终点。 Or 指的是两个序列只要满足一个就可以 Throughout 指的是满足前面要求才能执行后面的序列 二、Break&#xff1b;co…...

网络测速工具

1. SPEEDTEST https://www.speedtest.net/ 2. 测速网 测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测速, 物联网监测,Wi-Fi 7,Wi-Fi 6,FTTR,全屋Wi-Fi - SpeedTest.cn 3. 字节比特换算 bps&#xff08;bits per second&#xff09; 字节和比特的换算…...

windows将文件推给Android真机/实机

记录一下 因为以前只试过从真机实机中将文件推给windows 但是从windows只简单复制粘贴的话会一直报错。 1.电脑安装adb 2.手机开启开发者模式 usb调试 3.usb连接选择文件传输 4.推送命令adb push 文件路径 /sdcard/download 步骤1和2和3不作赘述&#xff0c;可以搜相关配置教程…...

Scratch教学作品 | 3D飞行模拟器——体验飞行的无限乐趣! ✈️

今天为大家推荐一款令人惊叹的Scratch作品——《3D飞行模拟器》&#xff01;由BamBozzle制作&#xff0c;这款游戏完全用Scratch构建&#xff0c;带你体验开放世界飞行的自由与乐趣。从起飞到降落&#xff0c;每一步都需要你的精准操作&#xff01;更棒的是&#xff0c;这款游戏…...

nonolog转化为ctf的困难

nonolog转化为ctf的困难 nanolog分析的中间的总结二者之间的差别 nanolog分析的中间的总结 如果目标是转nanolog为CTF格式&#xff0c;最重要的应该是meta的定义的转换的问题了。 目前我是稍有气馁。 感觉这不是一个好的方向。 如果领导能给连续的时间&#xff0c;完全开发自定…...