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

在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发

在这里插入图片描述

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。
技术合作请加本人wx(注明来自csdn):xt20160813

在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发

在之前的文章中,我们详细探讨了Orthanc作为轻量级PACS服务器的核心功能、DICOMweb支持以及Python实现的示例代码。为了进一步扩展Orthanc的应用场景,本文将聚焦于在Windows系统中,使用**C++**开发与Orthanc交互的应用程序,重点展示如何通过DICOMweb接口实现医学影像的查询、检索和上传功能。文章将提供完整的C++示例代码,包含关键注释,并介绍Windows环境下的开发配置和注意事项。


一、为何选择C++与Orthanc交互

C++是一种高性能、跨平台的编程语言,广泛应用于医疗影像处理和PACS系统开发。结合Orthanc的DICOMweb接口,使用C++开发具有以下优势:

  • 高性能:C++的低级控制和内存管理适合处理大型DICOM数据集。
  • 跨平台兼容性:C++代码可轻松移植到Linux或其他系统。
  • 与DICOM库集成:C++与DCMTK、GDCM等DICOM库无缝集成,增强影像处理能力。
  • Windows生态支持:Windows是许多医院和开发环境的首选平台,C++在Windows下有成熟的开发工具链。

本文将使用C++通过HTTP请求与Orthanc的DICOMweb接口交互,展示如何实现QIDO-RS(查询)、WADO-RS(检索)和STOW-RS(上传)功能。


二、开发环境准备

1. 安装Orthanc

在Windows系统中,推荐使用Docker或直接下载预编译的Windows二进制包运行Orthanc:

  • Docker方式
    docker pull orthanc/orthanc
    docker run -p 8042:8042 -p 4242:4242 orthanc/orthanc
    
  • Windows二进制包
    从Orthanc官网(https://www.orthanc-server.com/download.php)下载Windows版本,解压后运行Orthanc.exe

默认配置下,Orthanc的REST API和DICOMweb接口运行在http://localhost:8042

2. C++开发工具

  • 编译器:Visual Studio 2022(社区版免费),支持C++17及以上。
  • HTTP客户端库:使用cpp-httplib,一个轻量级的C++ HTTP客户端库,适合与RESTful接口交互。
  • JSON解析库:使用nlohmann/json,便于处理DICOMweb返回的JSON数据。
  • DICOM处理库(可选):如DCMTK或GDCM,用于解析DICOM文件。

3. 安装依赖库

使用vcpkg(Visual Studio的包管理器)安装cpp-httplibnlohmann/json

# 安装vcpkg(如果尚未安装)
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install# 安装cpp-httplib和nlohmann/json
.\vcpkg install cpp-httplib
.\vcpkg install nlohmann-json

4. Visual Studio项目配置

  1. 创建一个新的C++空项目。
  2. 在项目属性中:
    • 添加vcpkg的头文件路径:vcpkg\installed\x64-windows\include
    • 添加vcpkg的库路径:vcpkg\installed\x64-windows\lib
    • 链接cpp-httplib.libnlohmann_json.lib(根据需要)。

三、C++实现DICOMweb功能

以下展示如何使用C++与Orthanc的DICOMweb接口交互,实现以下功能:

  1. QIDO-RS:查询DICOM研究。
  2. WADO-RS:检索DICOM元数据。
  3. STOW-RS:上传DICOM文件。

1. 前置代码:HTTP客户端封装

我们创建一个简单的HTTP客户端类,封装cpp-httplib的请求功能,并使用nlohmann/json解析响应。

#include <httplib.h>
#include <nlohmann/json.hpp>
#include <string>
#include <iostream>
#include <fstream>using json = nlohmann::json;// HTTP客户端类,封装与Orthanc的交互
class OrthancClient {
private:httplib::Client client;std::string dicomWebRoot;public:OrthancClient(const std::string& host, int port, const std::string& root = "/dicom-web"): client(host, port), dicomWebRoot(root) {client.set_connection_timeout(10); // 设置连接超时为10秒client.set_read_timeout(30);       // 设置读取超时为30秒}// 发送GET请求并返回JSON响应json get(const std::string& endpoint, const httplib::Params& params = {}) {auto res = client.Get((dicomWebRoot + endpoint).c_str(), params);if (res && res->status == 200) {return json::parse(res->body);}throw std::runtime_error("GET request failed: " + std::to_string(res ? res->status : -1));}// 发送POST请求上传DICOM文件bool postDicomFile(const std::string& endpoint, const std::string& filePath) {std::ifstream file(filePath, std::ios::binary);if (!file.is_open()) {throw std::runtime_error("Cannot open file: " + filePath);}// 读取文件内容std::vector<char> fileData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());httplib::MultipartFormDataItems items = {{ "file", std::string(fileData.begin(), fileData.end()), std::filesystem::path(filePath).filename().string(), "application/dicom" }};auto res = client.Post((dicomWebRoot + endpoint).c_str(), items);return res && res->status == 200;}
};

代码注释

  • OrthancClient:封装HTTP客户端,初始化时指定Orthanc服务器的地址、端口和DICOMweb根路径。
  • get:发送GET请求,解析并返回JSON响应。
  • postDicomFile:发送POST请求,上传DICOM文件。

2. QIDO-RS:查询DICOM研究

以下代码展示如何查询患者ID为"12345"的DICOM研究。

void queryStudies(OrthancClient& client) {try {// 设置查询参数httplib::Params params = {{ "PatientID", "12345" },{ "00100020", "12345" } // 患者ID的DICOM标签};// 发送QIDO-RS请求json studies = client.get("/studies", params);// 解析并打印结果for (const auto& study : studies) {std::string studyUID = study["0020000D"]["Value"][0].get<std::string>();std::cout << "Study Instance UID: " << studyUID << std::endl;}} catch (const std::exception& e) {std::cerr << "Error in QIDO-RS: " << e.what() << std::endl;}
}

代码注释

  • params:设置查询条件,支持DICOM标签或标准字段。
  • client.get:发送GET请求到/dicom-web/studies端点。
  • 响应为JSON数组,包含匹配的研究信息。

3. WADO-RS:检索DICOM元数据

以下代码展示如何检索特定研究的元数据。

void retrieveMetadata(OrthancClient& client, const std::string& studyUID) {try {// 发送WADO-RS请求json metadata = client.get("/studies/" + studyUID + "/metadata");// 打印元数据(示例:Study Description)if (metadata.contains("00081030")) {std::string studyDesc = metadata["00081030"]["Value"][0].get<std::string>();std::cout << "Study Description: " << studyDesc << std::endl;}} catch (const std::exception& e) {std::cerr << "Error in WADO-RS: " << e.what() << std::endl;}
}

代码注释

  • /studies/{studyUID}/metadata:WADO-RS端点,返回研究的元数据。
  • metadata:JSON对象,包含DICOM标签及其值。

4. STOW-RS:上传DICOM文件

以下代码展示如何上传DICOM文件到Orthanc。

void uploadDicomFile(OrthancClient& client, const std::string& filePath) {try {// 发送STOW-RS请求bool success = client.postDicomFile("/studies", filePath);if (success) {std::cout << "DICOM file uploaded successfully: " << filePath << std::endl;} else {std::cerr << "Failed to upload DICOM file" << std::endl;}} catch (const std::exception& e) {std::cerr << "Error in STOW-RS: " << e.what() << std::endl;}
}

代码注释

  • postDicomFile:以multipart/form-data格式上传DICOM文件。
  • 成功上传后,Orthanc会解析并存储DICOM文件。

5. 主程序

以下是完整的程序入口,整合上述功能。

int main() {try {// 初始化Orthanc客户端OrthancClient client("localhost", 8042);// 查询研究std::cout << "Querying studies..." << std::endl;queryStudies(client);// 检索元数据std::string studyUID = "1.2.840.113619.2.55.3.60467153.1234.1234567890";std::cout << "\nRetrieving metadata for study: " << studyUID << std::endl;retrieveMetadata(client, studyUID);// 上传DICOM文件std::string dicomFile = "path/to/sample.dcm";std::cout << "\nUploading DICOM file: " << dicomFile << std::endl;uploadDicomFile(client, dicomFile);} catch (const std::exception& e) {std::cerr << "Main error: " << e.what() << std::endl;return 1;}return 0;
}

代码注释

  • 主程序初始化OrthancClient,依次调用查询、检索和上传功能。
  • 异常处理确保程序健壮性。

四、Windows系统下的注意事项

  1. 防火墙配置

    • 确保Orthanc的端口(默认8042和4242)未被Windows防火墙阻止。
    • 在Windows PowerShell中运行以下命令开放端口:
      netsh advfirewall firewall add rule name="Orthanc" dir=in action=allow protocol=TCP localport=8042,4242
      
  2. 文件路径

    • Windows使用反斜杠(\)作为路径分隔符,但在C++字符串中需转义为\\,或使用原始字符串(如R"(path\to\file)")。
    • 示例:"C:\\Users\\Username\\sample.dcm"
  3. 依赖库的DLL

    • 确保cpp-httplibnlohmann/json的动态链接库(.dll)在可执行文件的目录下,或已添加到系统PATH。
    • vcpkg会自动将DLL放置在vcpkg\installed\x64-windows\bin
  4. 字符编码

    • Orthanc的DICOMweb接口使用UTF-8编码,确保C++程序的字符串处理兼容UTF-8。
    • 在Visual Studio中,设置项目属性为“使用Unicode字符集”。
  5. 性能优化

    • 对于大规模DICOM文件上传,建议使用异步I/O或多线程以提高性能。
    • 调整cpp-httplib的超时参数,适应网络环境。

五、扩展:与DCMTK集成

若需解析或生成DICOM文件,可集成DCMTK库。以下是使用DCMTK读取DICOM文件并上传到Orthanc的示例:

1. 安装DCMTK

通过vcpkg安装DCMTK:

.\vcpkg install dcmtk

2. 示例代码:读取DICOM文件并上传

#include <dcmtk/dcmdata/dctk.h>void uploadDicomWithDCMTK(OrthancClient& client, const std::string& filePath) {try {// 使用DCMTK加载DICOM文件DcmFileFormat fileFormat;OFCondition status = fileFormat.loadFile(filePath.c_str());if (status.bad()) {throw std::runtime_error("Failed to load DICOM file: " + status.text());}// 验证DICOM文件有效性DcmDataset* dataset = fileFormat.getDataset();if (!dataset) {throw std::runtime_error("Invalid DICOM file");}// 上传文件client.postDicomFile("/studies", filePath);std::cout << "DICOM file validated and uploaded: " << filePath << std::endl;} catch (const std::exception& e) {std::cerr << "Error in DCMTK upload: " << e.what() << std::endl;}
}

代码注释

  • DcmFileFormat:加载DICOM文件并验证其格式。
  • 在上传前,DCMTK可用于提取元数据或进行预处理(如匿名化)。

六、实际应用场景

  1. 医院影像工作站

    • 开发Windows桌面应用,通过DICOMweb从Orthanc检索影像并显示。
    • 使用C++结合OpenGL或VTK实现影像渲染。
  2. 自动化影像处理

    • 开发批量上传DICOM文件的工具,结合DCMTK进行元数据验证。
    • 实现影像匿名化后上传到Orthanc。
  3. 远程诊断系统

    • 开发C++服务端程序,通过DICOMweb实时查询和传输影像到远程客户端。

七、总结

通过C++在Windows系统中与Orthanc的DICOMweb接口交互,开发者可以构建高性能、可靠的医学影像应用。本文提供的示例代码展示了查询、检索和上传DICOM文件的核心功能,并通过DCMTK扩展了DICOM文件处理能力。结合Windows的开发工具链和Orthanc的轻量级特性,C++开发者能够快速实现从桌面应用到服务器端服务的多种场景。

对于更复杂的应用,建议进一步探索Orthanc的插件系统或与其他影像处理库(如ITK、VTK)集成。

参考资源

  • Orthanc官方文档:https://book.orthanc-server.com/
  • cpp-httplib GitHub:https://github.com/yhirose/cpp-httplib
  • nlohmann/json GitHub:https://github.com/nlohmann/json
  • DCMTK官方文档:https://dicom.offis.de/

相关文章:

在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

视频太大?用魔影工厂压缩并转MP4,画质不打折!

在日常生活中&#xff0c;我们常常需要将视频文件转换成不同的格式以适应各种设备或平台的播放需求。魔影工厂作为一款功能强大且操作简单的视频转换工具&#xff0c;深受用户喜爱。本文中简鹿办公将手把手教你如何使用魔影工厂将视频转换为MP4格式&#xff0c;并进行个性化设置…...

Wan2.1 通过首尾帧生成视频

Wan2.1 通过首尾帧生成视频 flyfish 使用 Wan2.1-FLF2V-14B-720P 模型&#xff0c;通过输入两张图像&#xff08;起始帧和结束帧&#xff09;&#xff0c;生成一段连贯的视频。 First Last Frame-to-Video 即 “首末帧到视频” 技术 import numpy as np import torch import…...

宝塔+fastadmin:给项目添加定时任务

一、定时任务脚本编写 1. 使用 shebang 声明执行器 #!/usr/bin/env php 这是 Unix/Linux 系统中脚本文件的标准开头。表示这个脚本使用系统环境变量中的 php 来执行。2. 定义 ThinkPHP 入口路径并加载框架 define(APP_PATH, __DIR__ . /../../application/); require __DIR__…...

[自动化集成] 使用明道云上传附件并在Python后端处理Excel的完整流程

在企业日常自动化场景中,使用低代码平台如明道云搭建前端界面,结合自定义Python后端服务,实现灵活数据处理是一种高效的组合方式。本文将分享一个典型的集成用例:用户通过明道云上传文本和Excel附件,Python后端接收并解析这些信息,最终实现完整的数据处理闭环。 项目背景…...

前端项目采用响式布局

要让整个前端项目采用响应式布局&#xff0c;可以从多个方面进行优化&#xff0c;以下是一些具体的建议和实现方法&#xff1a; 1. 使用 ElementPlus 的响应式特性 ElementPlus 组件库本身提供了一些响应式的能力&#xff0c;例如 el-col 组件可以用于创建响应式的网格布局。…...

【Unity】DOTween的常用函数解释

DOTween插件常用函数解释 1.DOTween.To&#xff08;通用变化动画&#xff09; 解释&#xff1a;将某一个值在一定的时间内变化到另一个值&#xff08;通用的函数&#xff09;&#xff0c;可用于大部分的动画变化 使用示例&#xff1a; using UnityEngine; using DG.Tweenin…...

飞桨paddle import fluid报错【已解决】

跟着飞桨的安装指南安装了paddle之后 pip install paddlepaddle有一个验证&#xff1a; import paddle.fluid as fluid fluid.install check.run check()报错情况如下&#xff0c;但是我在pip list中&#xff0c;确实看到了paddle安装上了 我import paddle别的包&#xff0c…...

ELK简介和docker版安装

使用场景 主要还是给开发人员“打捞日志”用的。 ELK 是由三个开源工具组成的套件&#xff08;Elasticsearch、Logstash 和 Kibana&#xff09;&#xff0c;主要用于日志的收集、分析和可视化。以下是 ELK 常见的使用场景&#xff1a; 日志集中化管理 收集来自多个服务器或服…...

DockerHub被封禁,怎么将镜像传到国内?一种简单合规的镜像同步到国内方案[最佳实践]

Docker将容器化技术普及&#xff0c;推动云计算向云原生的演进。Docker的核心创新技术之一是容器镜像&#xff0c;它是一种文件的打包方式&#xff0c;将应用程序运行的操作系统、库、运行环境等依赖全部打包一起。在其他任意环境&#xff0c;只要可以运行docker服务&#xff0…...

飞桨paddle ‘ParallelEnv‘ object has no attribute ‘_device_id‘【已解决】

书借上回&#xff0c;自从我反复重装paddle之后&#xff0c;我发现了&#xff0c;只要pip list中有库&#xff0c;但是代码报错&#xff0c;那就是飞桨没把代码更新完全&#xff0c;只能自己去改源代码 我又遇到报错了&#xff1a; 根据报错信息&#xff0c;找到ParallelEnv报…...

网络安全面试题(一)

文章目录 一、基础概念与模型‌1. 什么是通信协议&#xff1f;列举三种常见的网络通信模型&#xff1f;2. 解释OSI七层模型及各层功能3. TCP/IP四层模型与OSI模型的对应关系是什么&#xff1f;4. 五层协议体系结构与TCP/IP模型的区别?5. 什么是面向连接与非面向连接的服务&…...

【Leetcode 每日一题】3355. 零数组变换 I

问题背景 给定一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li​,ri​]。 对于每个查询 q u e r i e s [ i ] queries[i] quer…...

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试 **背景与目标** 一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】二.操作步骤2.1 在x86-Linux上生成onnx模型,以及tflite量化模型(避免在RK3588上安装过多依赖)2.1.1 创建容器2.1.2 安装依赖2.1.3 下载推…...

力扣第5题:最长回文子串(动态规划)

小学生一枚&#xff0c;自学信奥中&#xff0c;没参加培训机构&#xff0c;所以命名不规范、代码不优美是在所难免的&#xff0c;欢迎指正。 标签&#xff1a; 字符串、动态规划、中心扩散法 语言&#xff1a; C 题目&#xff1a; 给你一个字符串s&#xff0c;找到s中最长的…...

HCIP实验五

一、实验拓扑图&#xff1a; 二、实验需求分析&#xff1a; 1. PreVal策略&#xff1a;要求确保R4通过R2到达192.168.10.0/24 &#xff0c;需在R4上针对去往该网段路由配置PreVal策略&#xff0c;为经R2的路径赋予更高优先值&#xff0c;影响本地路由表选路。 2. AS Path策略…...

python Numpy-数组

目录 Numpy&#xff1a; 一、Ndarray 1 定义 2 数组的属性方法 2.1 数组的维度&#xff1a;np.ndarray.shape 2.2 元素的类型&#xff1a;np.ndarray.dtype 2.3 数组元素的个数&#xff1a;np.ndarray.size 2.4 转置 3 ndarray 所存储元素的数据类型 4 数组创建 4.1 a…...

数据库分库分表从理论到实战

1.分库分表基础理论 1.1 分库分表基本概念 定义&#xff1a;分库分表是一种将单一数据库中的数据分散存储到多个数据库或表中的技术方案&#xff0c;其核心思想是通过"分而治之"的方式解决数据库性能瓶颈问题。分库&#xff1a;将表按业务或数据量拆分到不同数据库中…...

Java异常处理与File类终极指南

Java异常处理与File类终极指南 目录 异常体系全维度拆解异常处理十五种高阶模式自定义异常企业级实践File类深度探索与NIO进化论分布式系统异常处理架构性能调优与安全防护全网最全异常代码库一、异常体系全维度拆解 1.1 Java异常DNA解析 // 异常类的核心继承关系 public cla…...

pmap中的mode列,脏页,写时复制

写时复制&#xff08;Copy-on-Write&#xff0c;简称 COW&#xff09; 是一种计算机编程中的优化技术&#xff0c;主要用于内存或存储资源的管理。其核心思想是&#xff1a;只有在真正需要修改数据时&#xff0c;才会执行实际的复制操作&#xff0c;从而避免不必要的资源开销。…...

通过COM获取正在运行的Excel实例并关闭 c#实现

利用COM对象模型获取正在运行的Excel实例并关闭。示例代码如下&#xff1a; using Excel Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; try { Excel.Application excelApp (Excel.Application)Marshal.GetActiveObject("Excel.Applicatio…...

运行在华为云kubernetes应用接入APM服务

1 APM概述 在云时代微服务架构下应用日益丰富&#xff0c;纷杂的应用异常问题接踵而来。应用运维面临巨大挑战&#xff1a; 分布式应用关系错综复杂&#xff0c;应用性能问题分析定位困难&#xff0c;应用运维面临如何保障应用正常、快速完成问题定位、迅速找到性能瓶颈的挑战…...

虚幻引擎5-Unreal Engine笔记之摄像头camera

虚幻引擎5-Unreal Engine笔记之摄像头camera code review! 目录 第一部分&#xff1a;摄像头的基础概念 1.1 UE5 中摄像头的定义与作用1.2 UE5 中摄像头的类型与分类 第二部分&#xff1a;摄像头的代码结构与分类 2.1 摄像头是类还是组件&#xff1f;2.2 组件的本质&#xff…...

mysql的基础命令

1.SQL的基本概念 SQL 是用于管理和操作关系型数据库的标准编程语言。是所有关系型数据库&#xff08;如 MySQL、PostgreSQL、Oracle 等&#xff09;的通用语言。 SQL语句分类 DDL: Data Defination Language 数据定义语言 CREATE&#xff0c;DROP&#xff0c;ALTER DML: Da…...

去中心化算力池:基于IPFS+智能合约的跨校GPU资源共享平台设计

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、问题背景&#xff1a;高校算力孤岛的困境 现状痛点 各高校GPU集群利用率差异显著&…...

数据库(二):ORM技术

什么是 ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09; 是一种用于实现 对象模型&#xff08;面向对象&#xff09;与关系模型&#xff08;数据库&#xff09;之间映射的技术&#xff0c;使程序员可以通过操作对象的方式访问数据库数据&#xff0c;而无…...

Oracle基础知识

目录 1.别名的使用 2.AND的优先级高于OR 3.where后面可以接别名&#xff0c;order by后面不可以 4.Oracle中SQL的执行顺序(重点) 5.dual万用表 6.是否区分大小写 7.Oracle常用数据类型 8.Oracle常用函数 (1)length字符、lengthb字节和cast强制类型转换 (2)数据类型转…...

使用 vite-plugin-dynamic-base 实现运行时动态设置上下文路径

我们一般会在编译之前设置上下文&#xff0c;那么如何在编译之后动态设置上下文的路径&#xff1f; 本文使用的技术栈是 Go&#xff08;Gin&#xff09; Vue.js&#xff08;Vite&#xff09; 本文使用到的第三方包&#xff1a;https://github.com/chenxch/vite-plugin-dynam…...

spark-shuffle 类型及其对比

1. Hash Shuffle 原理&#xff1a;将数据按照分区键进行哈希计算&#xff0c;将相同哈希值的数据发送到同一个Reducer中。特点&#xff1a;实现简单&#xff0c;适用于数据分布均匀的场景。但在数据分布不均匀时&#xff0c;容易导致某些Reducer处理的数据量过大&#xff0c;产…...

力扣-快乐数

1.题目要求 2.题目链接 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 3.题目分析 首先,因为需要频繁地用到数字变为各个位上的平方的过程,我们可以将"对于一个正整数,每一次将该数替换为它每个位置的数字的平方和"这一操作抽象出来&#xff0c;定义成一个…...

每日算法刷题Day10 5.19:leetcode不定长滑动窗口求最长/最大4道题,结束定长滑动窗口,用时1h

不定长滑动窗口 不定长滑动窗口主要分为三类&#xff1a;求最长子数组&#xff0c;求最短子数组&#xff0c;以及求子数组个数。 注&#xff1a;滑动窗口相当于在维护一个队列。右指针的移动可以视作入队&#xff0c;左指针的移动可以视作出队。 滑动窗口【基础算法精讲 03】…...

FreeSWITCH 纯内网配置

纯内网&#xff0c;且同一个网段&#xff0c;Fs 可简化配置&#xff0c;要点是: 1. 不需要事先配置 directory&#xff0c;任意号码都可以注册&#xff0c;且无挑战 2. 呼叫无挑战 不需要考虑那么多安全问题 配置如下&#xff1a; 1. 全局变量 <X-PRE-PROCESS cmd"…...

STL中list的模拟

这里写目录标题 list 的节点 —— ListNodelist 的 “导览员” —— ListIteratorlist 的核心 —— list 类构造函数迭代器相关操作容量相关操作 结尾 在 C 的 STL&#xff08;标准模板库&#xff09;中&#xff0c;list 是一个十分重要的容器&#xff0c;它就像一个灵活的弹簧…...

【iOS】类结构分析

前言 之前我们已经探索得出对象的本质就是一个带有isa指针的结构体&#xff0c;这篇文章来分析一下类的结构以及类的底层原理。 类的本质 类的本质 我们在main函数中写入以上代码&#xff0c;然后利用clang对其进行反编译&#xff0c;可以得到c文件 可以看到底层使用Class接…...

Android 万能AI证件照 v1.3.2

在日常的生活和工作场景里&#xff0c;证件照的身影随处可见。找工作投简历时&#xff0c;它是展现你形象的 “第一张名片”&#xff1b;办理各类证件&#xff0c;缺了它可不行&#xff1b;参加各种考试报名&#xff0c;同样需要它。可以说&#xff0c;证件照虽小&#xff0c;却…...

【Java】封装在 Java 中是怎样实现的?

包 关于包有两个关键字 package : 声明当前类属于哪个包 和 import : 允许当前类使用其他类或接口时不使用全限定名 , 也就是导包 . IDEA 的普通项目文件包括 src : 包含源码和资源文件 和 out : 包含编译产物字节码文件 . 在 IDEA 开发环境建包会在 src 源码目录中生成 , 可…...

牛客网 NC14736 双拆分数字串 题解

牛客网 NC14736 双拆分数字串 题解 题目分析 解题思路 通过分析&#xff0c;我们可以发现&#xff1a; 当n≤3时&#xff0c;无法构造出双拆分数字串&#xff0c;因为数字位数太少对于n>3的情况&#xff0c;我们可以构造两种特殊形式&#xff1a; 当n为奇数时&#xff0c…...

超长文本注意力机制如何突破传统 O(n²) 瓶颈

介绍了当前在超长文本&#xff08;可达百万级及以上 Token&#xff09;生成与预测中&#xff0c;注意力机制如何突破传统 O(n) 瓶颈&#xff0c;并阐释多种高效注意力算法如何支持 超长上下文处理能力。 概览 当前主流 Transformer 在处理长序列时&#xff0c;由于每个 Token…...

异丙肌苷市场:现状、挑战与未来展望

摘要 本文聚焦异丙肌苷市场&#xff0c;深入分析了其市场规模与增长趋势、应用价值与市场驱动因素、面临的挑战以及竞争格局。异丙肌苷作为一种具有重要应用价值的改性核苷衍生物&#xff0c;在药物研发和治疗领域展现出潜力&#xff0c;但市场发展也面临诸多挑战。文章最后为…...

JAVA面向对象——对象和类的基本语法

JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型&#xff1a;变量&#xff08;如 int max 15;&#xff09;。数据结构&#xff1a;数组&#xff08;一维/二维&#xff09;、对象&#xff08;特殊数据结构&#xff0c;用于存储复…...

【windows】音视频处理工具-FFmpeg(合并/分离)

一、FFmpeg介绍 FFmpeg是一个‌开源的跨平台音视频处理框架。 法国计算机程序员 Fabrice Bellard 于 2000 年创建。 “FF”&#xff08;代表 “Fast Forward”&#xff0c;快进之意&#xff09;与 “mpeg”&#xff08;流行的视频压缩标准 MPEG&#xff0c;即运动图像专家组&am…...

Java并发编程:从基础到高级实战

在现代软件开发中&#xff0c;并发编程已成为不可或缺的核心技能。随着多核处理器的普及和分布式系统的发展&#xff0c;能否编写高效、线程安全的并发程序直接决定了应用程序的性能和可靠性。Java作为一门成熟的企业级编程语言&#xff0c;提供了丰富的并发编程工具和API&…...

在 Excel 中使用东方仙盟软件————仙盟创梦IDE

安装插件 用仙盟创梦编写插件代码 源码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 东方仙盟.仙盟创梦IDE_招标系统 {public static class 仙盟创梦_招标专…...

win7无线网络名称显示为编码,连接对应网络不方便【解决办法】

使用多个网络时可能需要切换到打印机的网络来打印东西&#xff0c;但是win7的编码问题导致不知道哪个网络是对应网络&#xff0c;可以使用批处理命令来自动连接道指定网络 将这个代码用文本文件打开后粘贴&#xff0c;然后另存为ansi格式的bat文件 代码中使用两种方式进行连接…...

.NET 10 - 尝试一下Minimal Api的Validation新特性

1.简单介绍 2025年11月微软将会发布.NET10&#xff0c;这是LTS(Long Term Support)版本。当前.NET10已经处于Preview4版本&#xff0c;微软对Runtime, Library, SDK, C#, Asp.NET Core, MAUI等都做了很多enhancement。近些年微软对Minimal Api一直在持续地更新。在.NET8中, Mi…...

C# Task 与 SynchronizationContext

示例代码 using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks;namespace Test {internal class Program{static void Main(string[] args){_mainThreadSynchronizationContext new ThreadSynchronizationContext(&qu…...

iOS Runtime与RunLoop的对比和使用

Runtime 机制 核心概念 Objective-C 的动态特性&#xff1a;Objective-C 是一门动态语言&#xff0c;很多工作都是在运行时而非编译时决定的消息传递机制&#xff1a;方法调用实际上是发送消息 objc_msgSend(receiver, selector, ...)方法决议机制&#xff1a;动态方法解析、…...

JavaSenderMail发送邮件(QQ及OFFICE365)

前言 这是今天处理的公司安排的一个任务&#xff1a;客户系统发送offices365邮件报错535 之前没怎么解除邮件业务&#xff0c;于是先搭个简单的QQ邮件Demo熟悉一下吧&#xff0c;没有啥公网内网的麻烦&#xff08;之前听说有内网限制&#xff0c;我还处理了一些环境上的问题&…...

八股文--JVM(2)

⭐️⭐️6.类加载 类加载器 JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码加载到JVM中&#xff0c;从而让程序启动 1.启动类加载器 ----JAVA_HOME/jre/libC编写加载的是JAVA_HOME/jre/lib 2.拓展类加载器 ----JAVA_HOME/jre/lib/ext 3.应用类加载器 ----C…...

【HTML-3】HTML 中的水平线与换行:基础元素详解

在网页设计中&#xff0c;合理的布局和内容分隔对于提升用户体验至关重要。HTML 提供了两个简单但强大的元素来实现这些功能&#xff1a;水平线 (<hr>) 和换行 (<br>)。本文将深入探讨这两个元素的用法、最佳实践以及现代替代方案。 1. 水平线 <hr> 元素 1…...