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

wordpress 改变网页/宁波搜索引擎优化seo

wordpress 改变网页,宁波搜索引擎优化seo,武汉网站建设公司,临邑县住房和城乡建设局网站Android静态ip设置的坑 Android静态ip设置,对于这个功能,如果没有接触过,会给人感觉是个特别简单的功能,直接调用系统的接口即可,其实这个功能还是有许多坑的,因为谷歌在Android SDK中对相关的API进行非系…

Android静态ip设置的坑

Android静态ip设置,对于这个功能,如果没有接触过,会给人感觉是个特别简单的功能,直接调用系统的接口即可,其实这个功能还是有许多坑的,因为谷歌在Android SDK中对相关的API进行非系统层的隐藏,打上了@hide标签,使得上层无法直接调用现有的接口,其中隐藏的API包含:EthernetManager,IpConfiguration,StaticIpConfiguration等接口,其中有的API虽然提供,但是关键的接口却被隐藏了。导致本来简单功能,变得无比繁琐,因此本文就对静态ip设置的坑做个总结,为相关开发者提供一个简易的参考。
解决Android静态ip设置的问题,可以从两个方面着手:

一方面有系统层接口的支持

系统接口也就是直接由系统层提供接口,一般是framework jar包上层直接调用接口传参,但是需要调整Gradle中的SDK的加载顺序,保证framework包正确替换AndroidSDK的jar包,否则编译会报错。

另一方面就是App层自己使用java的动态机制

动态机制即java的反射,通过反射调用系统隐藏的接口,但是这种方式发现在Android6以下的版本是可以的,Android6以上的版本虽然设置成功,设置里面参数也改了,但是重启你会发现,已经设置的静态模式会自动切换为动态模式,即系统不做数据存储保存,只是零时保存在内存中,所以你重启以后就被系统还原了,参考GitHub分析是高版本谷歌拦截了反射机制,不让非系统层修改数据,而且这个拦截是在C++层进行的,特别恶心,你绕都绕不过去,不过如果你的应用是Launcher应用的话,可以在App层做取巧,就是记录用户重启前是否做静态ip的保存,如果用户操作了静态ip保存,那么App启动的时候在Application的onCreate方法中下发静态ip配置,保证重启前静态ip状态和重启后的状态一致就能解决这个问题。以下就静态ip设置从系统层,App层两个方面做简要的代码实现分析:

1.系统层的实现:就是系统提供的接口直接调用,思路是先创建EthernetManager对象,接着创建StaticIpConfiguration对象,再使用StaticIpConfiguration对象创建IpConfiguration对象,最后将IpConfiguration设置给EthernetManager中即可,代码如下:
/*** 项目名称:demo* 描述* 静态ip的配置,通过framework.jar直调隐藏的系统接口*/
public class FEthernetUtil {private static EthernetManager mEthManager;private static StaticIpConfiguration mStaticIpConfiguration;private static IpConfiguration mIpConfiguration;/*** 描述* @param context* @param iFace //网口名称* @param ip * @param gateway* @param netmask* @param dns1* @param dns2* @return*/@SuppressLint("WrongConstant")public static int setStaticIp(Context context, String iFace, String ip, String gateway, String netmask, String dns1, String dns2) {//获取EthernetManager对象mEthManager = (EthernetManager) context.getSystemService("ethernet");if (setStaticIpConfiguration(ip, gateway, netmask, dns1, dns2)) {mEthManager.setConfiguration(iFace, mIpConfiguration);return 0;}return 1;}/*** 描述 初始mIpConfiguration* @param ip * @param gateway* @param netmask* @param dns1* @param dns2**/private static boolean setStaticIpConfiguration(String ip, String gateway, String netmask, String dns1, String dns2) {Inet4Address inetAddr = (Inet4Address) InetAddresses.parseNumericAddress(ip);int prefixLength = maskStr2InetMask(netmask);InetAddress gatewayAddr = InetAddresses.parseNumericAddress(gateway);InetAddress dnsAddr = InetAddresses.parseNumericAddress(dns1);if (null == inetAddr || inetAddr.getAddress().toString().isEmpty() || prefixLength == 0 || gatewayAddr.toString().isEmpty() || dnsAddr.toString().isEmpty()) {return false;}String dnsStr2 = dns2;ArrayList<InetAddress> dnsAddrs = new ArrayList<InetAddress>();dnsAddrs.add(dnsAddr);if (!dnsStr2.isEmpty()) {dnsAddrs.add(InetAddresses.parseNumericAddress(dns2));}mStaticIpConfiguration = new StaticIpConfiguration.Builder().setIpAddress(new LinkAddress(inetAddr, prefixLength)).setGateway(gatewayAddr).setDnsServers(dnsAddrs).build();mIpConfiguration = new IpConfiguration();mIpConfiguration.setIpAssignment(IpConfiguration.IpAssignment.STATIC);mIpConfiguration.setProxySettings(IpConfiguration.ProxySettings.NONE);mIpConfiguration.setStaticIpConfiguration(mStaticIpConfiguration);return true;}/*** 描述* 子网掩码解析* @param maskStr* @return int**/private static int maskStr2InetMask(String maskStr) {StringBuffer sb;String str;int inetmask = 0;int count = 0;/** check the subMask format*/Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$");if (pattern.matcher(maskStr).matches() == false) {return 0;}String[] ipSegment = maskStr.split("\\.");for (String s : ipSegment) {sb = new StringBuffer(Integer.toBinaryString(Integer.parseInt(s)));str = sb.reverse().toString();count = 0;for (int i = 0; i < str.length(); i++) {i = str.indexOf("1", i);if (i == -1) break;count++;}inetmask += count;}return inetmask;}
}

拿到系统层的jar包,跟使用其他jar一样进行gradle依赖配置,需要注意是gradle中的jar包加载顺序修改:

plugins {id 'com.android.library'id 'org.jetbrains.kotlin.android'
}......
dependencies {implementation 'androidx.core:core-ktx:1.8.0'api(files("libs/framework.jar"))//系统层配置静态ip的jar包
}gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet = options.bootstrapClasspath.getFiles();List<File> newFileList = new ArrayList<>()newFileList.add(new File("libs/framework.jar"))//加载本地系统jar包newFileList.addAll(fileSet)options.bootstrapClasspath = files(newFileList.toArray())}
}
//调整jar包的顺序
preBuild {doLast {def imlFile = file(project.name + ".iml")println('Change ' + project.name + '.iml order')try {def parsedXml = (new XmlParser()).parse(imlFile)def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }parsedXml.component[1].remove(jdkNode)def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"new groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))} catch (FileNotFoundException e) {}}
2.App层的实现:App层实现通过反射来操作,实现思路其实和系统层实现是一样的逻辑,首先需要先获取EthernetManager对象,接着创建StaticIpConfiguration对象,再根据StaticIpConfiguration对象反射创建,IpConfiguration对象,和系统层对比App层是使用反射来获取对象而已逻辑是一样的:以下是代码实现:
class EthernetUtil @Inject constructor(@ApplicationContext private val context: Context,private val ipConfigRepository: IPConfigRepository,private val guideRepository: GuideRepository
) {/*** 设置以太网静态IP地址** @param address ip地址* @param mask    子网掩码* @param gate    网关* @param dns     dns*/fun setEthernetStaticIp(address: String,mask: String,gate: String,dns: String,dns2: String): Boolean {d(TAG, "setEthernetStaticIp --> ip: $address, mask: $mask, gate: $gate, dns: $dns, dns2: $dns2")return try {val ethernetManagerCls = Class.forName("android.net.EthernetManager")//获取EthernetManager实例@SuppressLint("WrongConstant") val ethManager = getApp().getSystemService("ethernet")val ipInfo = ipConfigRepository.getDefaultIp()val primaryDNS = if (dns.isNullOrEmpty() || dns.isNullOrBlank()) {ipInfo.IPAddress?.PrimaryDNS?.ipAddress} else {dns}val secondaryDNS = if (dns2.isNullOrEmpty() || dns2.isNullOrBlank()) {ipInfo.IPAddress?.SecondaryDNS?.ipAddress} else {dns2}//创建StaticIpConfigurationval staticIpConfiguration =newStaticIpConfiguration(address, gate, mask, primaryDNS ?: "", secondaryDNS ?: "")//创建IpConfigurationval ipConfiguration = newIpConfiguration(staticIpConfiguration)//获取EthernetManager的setConfiguration()val setConfigurationMethod = ethernetManagerCls.getDeclaredMethod("setConfiguration",*arrayOf(NET_ETH_0.javaClass, ipConfiguration.javaClass))//保存静态ip设置saveIpSettings(getApp(), address, mask, gate, dns, dns2)//保存和硬终端一致dns为空也配置//设置静态IPsetConfigurationMethod.invoke(ethManager, NET_ETH_0, ipConfiguration)guideRepository.guideStatus = truetrue} catch (e: Exception) {e.printStackTrace()false}}/**** 创建StaticIpConfiguration对象*/@Throws(Exception::class)private fun newStaticIpConfiguration(address: String,gate: String,mask: String,dns: String,dns2: String): Any {val staticIpConfigurationCls = Class.forName("android.net.StaticIpConfiguration")//实例化StaticIpConfigurationval staticIpConfiguration = staticIpConfigurationCls.newInstance()val ipAddress = staticIpConfigurationCls.getField("ipAddress")val gateway = staticIpConfigurationCls.getField("gateway")val domains = staticIpConfigurationCls.getField("domains")val dnsServers = staticIpConfigurationCls.getField("dnsServers")//设置ipAddressipAddress[staticIpConfiguration] = newLinkAddress(address, mask)//设置网关gateway[staticIpConfiguration] = InetAddress.getByName(gate)//设置掩码domains[staticIpConfiguration] = mask//设置dns1val dnsList = dnsServers[staticIpConfiguration] as ArrayList<InetAddress>dnsList.add(InetAddress.getByName(dns))//设置dns2dnsList.add(InetAddress.getByName(dns2))return staticIpConfiguration}/*** 获取LinkAddress实例*/@Throws(Exception::class)private fun newLinkAddress(address: String, mask: String): Any? {val linkAddressCls = Class.forName("android.net.LinkAddress")val linkAddressConstructor = linkAddressCls.getDeclaredConstructor(InetAddress::class.java,Int::class.java)d(TAG, "子网掩码参数:ip: ${InetAddress.getByName(address)} ${maskStr2InetMask(mask)}")return linkAddressConstructor.newInstance(InetAddress.getByName(address),maskStr2InetMask(mask))}/*** 获取IpConfiguration实例*/@Throws(Exception::class)private fun newIpConfiguration(staticIpConfiguration: Any): Any {val ipConfigurationCls = Class.forName("android.net.IpConfiguration")val ipConfiguration = ipConfigurationCls.newInstance()//设置StaticIpConfigurationval staticIpConfigurationField = ipConfigurationCls.getField("staticIpConfiguration")staticIpConfigurationField[ipConfiguration] = staticIpConfiguration//获取ipAssignment、proxySettings的枚举值val ipConfigurationEnum = getIpConfigurationEnum(ipConfigurationCls)//设置ipAssignmentval ipAssignment = ipConfigurationCls.getField("ipAssignment")ipAssignment[ipConfiguration] = ipConfigurationEnum["IpAssignment.STATIC"]//设置proxySettingsval proxySettings = ipConfigurationCls.getField("proxySettings")proxySettings[ipConfiguration] = ipConfigurationEnum["ProxySettings.STATIC"]return ipConfiguration}/*** 获取IpConfiguration的枚举值*/private fun getIpConfigurationEnum(ipConfigurationCls: Class<*>): Map<String, Any> {val enumMap: MutableMap<String, Any> = HashMap()val enumClass = ipConfigurationCls.declaredClassesfor (enumC in enumClass) {val enumConstants = enumC.enumConstants ?: continuefor (enu in enumConstants) {enumMap[enumC.simpleName + "." + enu.toString()] = enu}}return enumMap}/*** 保存静态ip设置*/private fun saveIpSettings(context: Context,address: String,mask: String,gate: String,dns: String,dns2: String) {val contentResolver = context.contentResolverSettings.Global.putString(contentResolver, "ethernet_static_ip", address)Settings.Global.putString(contentResolver, "ethernet_static_mask", mask)Settings.Global.putString(contentResolver, "ethernet_static_gateway", gate)Settings.Global.putString(contentResolver, "ethernet_static_dns1", dns)Settings.Global.putString(contentResolver, "ethernet_static_dns2", dns2)}/*** 获取子网掩码长度*/private fun maskStr2InetMask(maskStr: String): Int {var sb: StringBuffervar str: Stringvar inetmask = 0var count = 0/**** check mask format*/val pattern: Pattern =Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$")if (pattern.matcher(maskStr).matches() === false) {d(TAG, "subMask is error")return 0}val ipSegment = maskStr.split("\\.".toRegex()).toTypedArray()for (n in ipSegment.indices) {sb = StringBuffer(Integer.toBinaryString(ipSegment[n].toInt()))str = sb.reverse().toString()count = 0var i = 0while (i < str.length) {i = str.indexOf("1", i)if (i == -1) breakcount++i++}inetmask += count}return inetmask}

相关文章:

Android静态ip设置的坑

Android静态ip设置的坑 Android静态ip设置&#xff0c;对于这个功能&#xff0c;如果没有接触过&#xff0c;会给人感觉是个特别简单的功能&#xff0c;直接调用系统的接口即可&#xff0c;其实这个功能还是有许多坑的&#xff0c;因为谷歌在Android SDK中对相关的API进行非系…...

电源管理(PMIC)TPS63070RNMR、TPS650942A0RSKR、LM5175RHFR器件介绍、应用及特点。

一、TPS63070RNMR&#xff0c;降压升压 开关稳压器 IC 正 可调式 2.5V 1 输出 3.6A&#xff08;开关&#xff09; 15-PowerVFQFN 1、概述 TPS63070高输入电压降压-升压转换器是一款高效的低静态电流降压-升压转换器。这些器件适用于输入电压高于或低于输出电压的应用。升压模式…...

k8s(kubernetes)介绍篇

一、Kubernetes 是什么 Kubernetes 是一个全新的基于容器技术的分布式架构解决方案&#xff0c;是 Google 开源的一个容器集群管理系统&#xff0c;Kubernetes 简称 K8S。 Kubernetes 是一个一站式的完备的分布式系统开发和支撑平台&#xff0c;更是一个开放平台&#xff0c;对…...

gRPC + Spring Boot 编程教程 - piot

在本文中&#xff0c;您将学习如何实现通过 gRPC 通信的 Spring Boot 应用程序。gRPC 是一个现代开源远程过程调用 (RPC) 框架&#xff0c;可以在任何环境中运行。默认情况下&#xff0c;它使用 Google 的 Protocol Buffer 来序列化和反序列化结构化数据。当然&#xff0c;我们…...

新建Spring Boot项目

使用IDEA 来创建: 文件-新建-项目 填写项目元数据 选择依赖项 此处可以先选 web-spring web 关于这些依赖项&#xff0c;更多可参考&#xff1a; IDEA创建Spring boot项目时各依赖的说明&#xff08;Developer Tools篇&#xff09;[1] 项目结构介绍 展开项目&#xff0c;此时…...

Python数据分析的第三方库

ython作为一种简单易学、功能强大的编程语言&#xff0c;逐渐成为数据分析领域的首选工具。在Python数据分析中&#xff0c;有许多优秀的第三方库可以帮助我们进行数据处理、可视化和建模。 常用第三方库&#xff1a; NumPy&#xff1a;提供了高性能的多维数组对象和用于数组…...

EF列表分页查询(单表、多表),排除参数为空的条件

在日常使用EF框架查询数据库时&#xff0c;有时传入的参数为空,那么我们应该把该条件排除&#xff0c;不应列入组装的sql中&#xff0c;本篇文件以分页查询为例介绍EF框架的单表、多表的多条件查询&#xff0c;参数为空时排除条件。 首先我们要有派生自DBContext类的数据上下文…...

VisualStudio配置pybind11-Python调用C++方法

个人测试下来Debug生成的dll改pyd&#xff0c;py中import会报错gilstate->autoInterpreterState 如果遇到同样问题使用Release吧 目录 1.安装pybind11 1.pip&#xff1a; 2.github&#xff1a; 2.配置VS工程 2.在VC目录中的包含目录添加&#xff1a; 3.在VC目录中的库目录…...

ZZULIOJ 1164: 字符串加密,Java

ZZULIOJ 1164: 字符串加密&#xff0c;Java 题目描述 输入一串字符&#xff08;长度不超过100&#xff09;和一个正整数k&#xff0c;将其中的英文字母加密并输出加密后的字符串&#xff0c;非英文字母不变。加密思想&#xff1a;将每个字母c加一个序数k&#xff0c;即用它后…...

联合体(共用体)的简单介绍

目录 概念&#xff1a; 联合的声明&#xff1a; 类比结构体&#xff1a; 联合体的大小&#xff1a; 联合的⼤⼩⾄少是最⼤成员的⼤⼩ 联合体的空间是共用的 联合体内部成员的赋值&#xff1a; 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候&#xff0c;就要对⻬到最⼤对⻬…...

Ansible学习笔记8

group模块&#xff1a; 创建一个group组&#xff1a; [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…...

五子棋游戏禁手算法的改进

五子棋游戏禁手算法的改进 五子棋最新的禁手规则&#xff1a; 1&#xff0e;黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”&#xff08;包括“四三三”&#xff09;、“四四”&#xff08;包括“四四三”&#xff09;和“长连”。黑棋只能以“四三”取胜。 2&#xff0e;黑方…...

基于 Debian 12 的 Devuan GNU+Linux 5 为软件自由爱好者而生

导读Devuan 开发人员宣布发布 Devuan GNULinux 5.0 “代达罗斯 “发行版&#xff0c;它是 Debian GNU/Linux 操作系统的 100% 衍生版本&#xff0c;不包含 systemd 和相关组件。 Devuan GNULinux 5 基于最新的 Debian GNU/Linux 12 “书虫 “操作系统系列&#xff0c;采用长期支…...

算法系列-力扣234-回文链表判定

回文链表判定 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 方法一&#xff1a;栈反转对比法 解题思路&#xff1a;找到中间节点后用栈辅助反转对比 解题方法&#xff1…...

算法通关村——海量数据场景下的热门算法题的处理方法

1. 从40个亿中产生一个不存在的整数 题目要求&#xff1a;给定一个输入文件&#xff0c;包含40亿个非负整数&#xff0c;请设计一个算法&#xff0c;产生一个不存在该文件中的整数&#xff0c;假设你有1GB的内存来完成这项任务。 ● 进阶&#xff1a;如果只有10MB的内存可用&a…...

【C++从0到王者】第二十五站:多继承的虚表

文章目录 前言一、多继承的虚函数表二、菱形继承与菱形虚拟继承的虚函数表1.菱形继承2.菱形虚拟继承的虚函数表 三、抽象类1.抽象类的概念2.接口继承与实现继承 总结 前言 其实关于单继承的虚函数表我们在上一篇文章中已经说过了&#xff0c;就是派生类中的虚表相当于拷贝了一…...

老程序员教你如何笑对问题,轻松培养逻辑思考和解决问题的能力

原文链接 ​​​​​​​老程序员教你如何笑对问题&#xff0c;轻松培养逻辑思考和解决问题的能力 故事发生在一个阳光明媚的午后&#xff0c;我们的主人公&#xff0c;老李&#xff0c;一位拥有十年工作经验的 Python 老程序员&#xff0c;正悠哉地在喝着咖啡。 这时&#x…...

Omni Recover for Mac(专业的iPhone数据恢复软件)

Omni Recover for Mac是一款专业的Mac数据恢复软件&#xff0c;能够帮助用户快速找回被误删除、格式化、病毒攻击等原因造成的文件和数据&#xff0c;包括图片、视频、音频、文档、邮件、应用程序等。同时&#xff0c;Omni Recover for Mac还具有数据备份和清理功能&#xff0c…...

视频垂直镜像播放,为您的影片带来新鲜感

大家好&#xff01;在制作视频时&#xff0c;我们常常希望能够给观众带来一些新鲜感和独特的视觉效果。而垂直镜像播放是一个能够让您的影片与众不同的技巧。然而&#xff0c;传统的视频剪辑软件往往无法直接实现视频的垂直镜像播放&#xff0c;给我们带来了一些困扰。现在&…...

十一、MySQL(DQL)聚合函数

1、聚合函数 注意&#xff1a;在使用聚合函数时&#xff0c;所有的NULL是不参与运算的。 2、实际操作&#xff1a; &#xff08;1&#xff09;初始化表格 &#xff08;2&#xff09;统计该列数据的个数 基础语法&#xff1a; select count(字段名) from 表名; &#xff1b;统…...

C语言:三子棋小游戏

简介&#xff1a; 目标很简单&#xff1a;实现一个 三子棋小游戏。三子棋大家都玩过&#xff0c;规则就不提及了。本博文中实现的三子棋在对局中&#xff0c;电脑落子是随机的&#xff0c;不具有智能性&#xff0c;玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一…...

JAVA - PO DTO 生成器

PO DTO 生成器 假设你是一个Java 高级程序员&#xff0c;我会提供一些信息&#xff0c;你需要帮我自动生成Java的PO、DTO 对象。 这些信息有着固定的形式&#xff0c;第一行是对象的类名&#xff0c;其后的每一行都是该对象的属性(简称“属性”)。 对于我属性&#xff0c;格式…...

tcpdump

TCPDump是一个用于抓取网络数据包的命令行工具。它可以帮助网络管理员和开发人员分析网络流量、故障排除以及安全问题。下面是一些TCPDump的详细用法&#xff1a; 基本用法&#xff1a; 监听指定网络接口&#xff1a;tcpdump -i eth0通过IP地址过滤&#xff1a;tcpdump host 19…...

数据通信——传输层TCP(可靠传输原理的ARQ)

引言 上一篇讲述了停止等待协议的工作流程&#xff0c;在最后提到了ARQ自动请求重传机制。接下来&#xff0c;我们就接着上一篇的篇幅&#xff0c;讲一下ARQ这个机制 还是这个图来镇楼 ARQ是什么&#xff1f; 发送端对出错的数据帧进行重传是自动进行的&#xff0c;因而这种…...

Compose - 交互组合项

按钮 Button OutLinedButton带外边框、TextButton只是文字、IconButton只是图标形状。 Button(onClick { }, //点击回调modifier Modifier,enabled true, //启用或禁用interactionSource MutableInteractionSource(),elevation ButtonDefaults.elevatedButtonElevation( /…...

【发版公告】Virbox Protector 3.1.3.19051 发版- elf 文件支持导入表保护

深盾安全-软件保护工具 Virbox Protector 3 &#xff08; 3.1.3.19051&#xff09;迎来了版本升级.本次升级支持了 elf 文件导入表保护。 以下是本次 Virbox Protector 发版的主要功能&#xff1a; 新功能 1. ELF格式的程序支持导入表保护(Beta)&#xff1b;&#xff1b; 2…...

点云数据做简单的平面的分割 三维场景中有平面,杯子,和其他物体 实现欧式聚类提取 对三维点云组成的场景进行分割

点云分割是根据空间,几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提,例如逆向工作,CAD领域对零件的不同扫描表面进行分割,然后才能更好的进行空洞修复曲面重建,特征描述和提取,进而进行基于3D内容的检索,组合…...

C++之std::search应用实例(一百八十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

一文详解 requests 库中 json 参数和 data 参数的用法

在requests库当中&#xff0c;requests请求方法&#xff0c;当发送post/put/delete等带有请求体的请求时&#xff0c;有json和data2个参数可选。 众所周知&#xff0c;http请求的请求体格式主要有以下4种&#xff1a; application/json applicaiton/x-www-from-urlencoded mu…...

Django学习笔记-AcApp端授权AcWing一键登录

笔记内容转载自 AcWing 的 Django 框架课讲义&#xff0c;课程链接&#xff1a;AcWing Django 框架课。 AcApp 端使用 AcWing 一键授权登录的流程与之前网页端的流程一样&#xff0c;只有申请授权码这一步有一点细微的差别&#xff1a; 我们在打开 AcApp 应用之后会自动向 AcW…...