android11 usb摄像头添加多分辨率支持

部分借鉴于:https://blog.csdn.net/weixin_45639314/article/details/142210634

目录

一、需求介绍

二、UVC介绍

三、解析

四、补丁修改

1、预览的限制主要存在于hal层和framework层

2、添加所需要的分辨率:

3、hal层修改

4、frameworks

5、备用方案


一、需求介绍

        这个问题是碰到了一个客户,他的需求是在Android11 rk3566上需要支持1080p以上的usb摄像头支持,而在我们Android11系统原生的相机中可以打开的最大分辨率也是1080p(即2.1百万像素)。

而我们客户需要支持2560*1440(2k-四百万像素),和最大3840*2610(4k-800万像素)。

二、UVC介绍

        UVC(USB Video Class)是一种 USB 设备类标准,允许通过 USB 连接的视频设备(如摄像头、网络摄像头和其他视频捕捉设备)与计算机或其他主机设备进行通信。UVC 使得视频设备的使用变得更加简单和通用,因为它不需要特定的驱动程序,主机操作系统通常可以直接识别和使用这些设备。

特点:

1、即插即用:
UVC 设备可以在连接到主机时自动识别,无需安装额外的驱动程序。这使得用户能够快速方便地使用视频设备。
2、跨平台支持:
UVC 设备通常可以在多种操作系统上工作,包括 Windows、macOS 和 Linux。这种跨平台的兼容性使得 UVC 成为视频设备的标准选择。
3、视频格式支持:
UVC 支持多种视频格式和分辨率,包括 MJPEG、YUY2、H.264 等。设备可以根据主机的能力和应用程序的需求选择合适的格式。
4、控制功能:
UVC 设备通常支持多种控制功能,例如亮度、对比度、饱和度、焦距等。这些控制可以通过 USB 接口进行调整。
5、流媒体支持:
UVC 设备可以用于实时视频流传输,适用于视频会议、直播、监控等应用场景。
 

三、解析

1、v4l2命令的使用

//列出所有设视频设备
v4l2-ctl --list-devices                
//获取特定设备的支持格式
v4l2-ctl --device=/dev/video23 --list-formats
//获取设备支持的分辨率
v4l2-ctl -d /dev/video23 --list-framesizes=YUYV

2、查看打开的摄像头的各种信息

dumpsys media.camera

四、补丁修改

1、预览的限制主要存在于hal层和framework层

关于摄像头部分的源码目录:

#SDK 接口
frameworks/base/core/java/android/hardware/Camera.java
frameworks/base/core/jni/android_hardware_Camera.cpp

#上层 Camera 服务
frameworks/av/camera/

# HAL层
hardware/rockchip/camera
hardware/interfaces/camera/

# 配置文件,对应USB和CSI之类的摄像头配置
# 包含了支持分辨率,闪光灯等等的一些特性。
device/rockchip/common/external_camera_config.xml
hardware/rockchip/camera/etc/camera/
2、添加所需要的分辨率:
diff --git a/device/rockchip/common/external_camera_config.xml b/device/rockchip/common/external_camera_config.xml
index d377826..d5ddd9d 100755
--- a/external_camera_config.xml
+++ b/external_camera_config.xml
@@ -60,13 +60,18 @@
             <Limit  width="1600" height="1200" fpsBound="15.0" />
             <Limit  width="1920" height="1080" fpsBound="30.0" />
             <Limit  width="1920" height="1080" fpsBound="15.0" />
+            <Limit  width="2560" height="1440" fpsBound="30.0" />
+            <Limit  width="2560" height="1440" fpsBound="15.0" />
             <Limit  width="2592" height="1944" fpsBound="30.0" />
             <Limit  width="2592" height="1944" fpsBound="15.0" />
             <Limit  width="2592" height="1944" fpsBound="10.0" />
             <Limit  width="2592" height="1944" fpsBound="5.0" />
+            <Limit  width="3840" height="2160" fpsBound="30.0" />
+            <Limit  width="3840" height="2160" fpsBound="15.0" />
             <!-- image size larger than the last entry will not be supported-->
         </FpsList>
         <!-- orientation -->
-        <Orientation  degree="90"/>
+       <!--        <Orientation  degree="90"/>     这里调整的是摄像头的旋转方向 -->
+       <Orientation  degree="0"/>      <!-- for qipai camera -->
     </Device>
 </ExternalCamera>
3、hal层修改

源码路径:hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp

diff --git a/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp b/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
index 55a2c3d08d..d3eb278093 100644
--- a/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
+++ b/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
@@ -21,21 +21,21 @@
namespace android {
namespace camera2 {
-#if (defined(TARGET_RK32) || defined(TARGET_RK3368))
+//#if (defined(TARGET_RK32) || defined(TARGET_RK3368))
#define RGA_VER (2.0)
#define RGA_ACTIVE_W (4096)
#define RGA_VIRTUAL_W (4096)
#define RGA_ACTIVE_H (4096)
#define RGA_VIRTUAL_H (4096)
-#else
-#define RGA_VER (1.0)
-#define RGA_ACTIVE_W (2048)
-#define RGA_VIRTUAL_W (4096)
-#define RGA_ACTIVE_H (2048)
-#define RGA_VIRTUAL_H (2048)
+//#else
+//#define RGA_VER (1.0)
+//#define RGA_ACTIVE_W (2048)
+//#define RGA_VIRTUAL_W (4096)
+//#define RGA_ACTIVE_H (2048)
+//#define RGA_VIRTUAL_H (2048)
-#endif
+//#endif
int RgaCropScale::CropScaleNV12Or21(struct Params* in, struct Params* out)
4、frameworks

源码路径:frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
上层接口解除1080P的限制。

diff --git a/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h b/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
index 3a709c9791..163d060b81 100644
--- a/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
+++ b/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
@@ -199,11 +199,11 @@ struct Parameters {
     // Max preview size allowed
     // This is set to a 1:1 value to allow for any aspect ratio that has
     // a max long side of 1920 pixels
-    static const unsigned int MAX_PREVIEW_WIDTH = 1920;
-    static const unsigned int MAX_PREVIEW_HEIGHT = 1920;
+    static const unsigned int MAX_PREVIEW_WIDTH = 4656;
+    static const unsigned int MAX_PREVIEW_HEIGHT = 3496;
     // Initial max preview/recording size bound
-    static const int MAX_INITIAL_PREVIEW_WIDTH = 1920;
-    static const int MAX_INITIAL_PREVIEW_HEIGHT = 1080;
+    static const int MAX_INITIAL_PREVIEW_WIDTH = 4656;
+    static const int MAX_INITIAL_PREVIEW_HEIGHT = 3496;
     // Aspect ratio tolerance
     static const CONSTEXPR float ASPECT_RATIO_TOLERANCE = 0.001;
     // Threshold for slow jpeg mode

到这里,系统相机—设置—分辨率与画质,应该就可以看到对应的最大的分辨率了。

5、备用方案

如果以上修改未能生效,可参考以下修改(该部分有经RK厂商修改):

hardware/interfaces/camera

From 75e1d29219f929404f3b42b994ac36dde19b0c82 Mon Sep 17 00:00:00 2001
From: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date: Tue, 19 Jan 2021 21:26:03 +0800
Subject: [PATCH 1/4] Camera: fix loss resolution issues

Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Change-Id: I01f614eec54168ab34e0c7376296a64804af9a1a
---
 .../3.4/default/ExternalCameraDevice.cpp      | 75 ++++++++++++++++---
 .../3.4/default/ExternalCameraUtils.cpp       |  0
 .../ExternalCameraUtils.h                     |  1 +
 3 files changed, 65 insertions(+), 11 deletions(-)
 mode change 100644 => 100755 camera/device/3.4/default/ExternalCameraUtils.cpp
 mode change 100644 => 100755 camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h

diff --git a/camera/device/3.4/default/ExternalCameraDevice.cpp b/camera/device/3.4/default/ExternalCameraDevice.cpp
index d196e4b4f..882698fd3 100755
--- a/camera/device/3.4/default/ExternalCameraDevice.cpp
+++ b/camera/device/3.4/default/ExternalCameraDevice.cpp
@@ -338,6 +338,7 @@ status_t ExternalCameraDevice::initDefaultCharsKeys(
 
     // android.jpeg
     const int32_t jpegAvailableThumbnailSizes[] = {0, 0,
+                                                  160, 120,
                                                   176, 144,
                                                   240, 144,
                                                   256, 144,
@@ -587,15 +588,24 @@ status_t ExternalCameraDevice::initOutputCharskeysByFormat(
         return UNKNOWN_ERROR;
     }
 
+    ALOGV("inputfourcc:%c%c%c%c",
+        fourcc & 0xFF,
+        (fourcc >> 8) & 0xFF,
+        (fourcc >> 16) & 0xFF,
+        (fourcc >> 24) & 0xFF);
+
     std::vector<int32_t> streamConfigurations;
     std::vector<int64_t> minFrameDurations;
     std::vector<int64_t> stallDurations;
 
     for (const auto& supportedFormat : mSupportedFormats) {
+#if 0
+        // wpzz add don't need skip now.
         if (supportedFormat.fourcc != fourcc) {
             // Skip 4CCs not meant for the halFormats
             continue;
         }
+#endif
         for (const auto& format : halFormats) {
             streamConfigurations.push_back(format);
             streamConfigurations.push_back(supportedFormat.width);
@@ -633,6 +643,13 @@ status_t ExternalCameraDevice::initOutputCharskeysByFormat(
             stallDurations.push_back(supportedFormat.height);
             stallDurations.push_back(stall_duration);
         }
+        ALOGV("supportedFormat:%c%c%c%c, w %d, h %d, minFrameDuration(%lld)",
+            supportedFormat.fourcc & 0xFF,
+            (supportedFormat.fourcc >> 8) & 0xFF,
+            (supportedFormat.fourcc >> 16) & 0xFF,
+            (supportedFormat.fourcc >> 24) & 0xFF,
+            supportedFormat.width, supportedFormat.height, minFrameDuration);
+
     }
 
     UPDATE(streamConfiguration, streamConfigurations.data(), streamConfigurations.size());
@@ -667,6 +684,8 @@ bool ExternalCameraDevice::calculateMinFps(
         fpsRanges.push_back(framerate);
     }
     minFps /= 2;
+    if (0 == minFps)
+        minFps = 1;
     int64_t maxFrameDuration = 1000000000LL / minFps;
 
     UPDATE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, fpsRanges.data(),
@@ -713,26 +732,24 @@ status_t ExternalCameraDevice::initOutputCharsKeys(
         }
     }
 
-    if (hasDepth) {
-        initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_Z16, halDepthFormats,
-                ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT,
-                ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
-                ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS,
-                ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
-    }
     if (hasColor) {
         initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_MJPEG, halFormats,
                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
                 ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
                 ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
-    }
-    if (hasColor_yuv) {
+    } else if (hasColor_yuv) {
         initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_YUYV, halFormats,
                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
                 ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
                 ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
+    } else if (hasDepth) {
+        initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_Z16, halDepthFormats,
+                ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT,
+                ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
+                ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS,
+                ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
     }
 
     calculateMinFps(metadata);
@@ -765,7 +782,7 @@ status_t ExternalCameraDevice::initOutputCharsKeys(
 void ExternalCameraDevice::getFrameRateList(
         int fd, double fpsUpperBound, SupportedV4L2Format* format) {
     format->frameRates.clear();
-
+    format->maxFramerate = 1.0f;
     v4l2_frmivalenum frameInterval {
         .pixel_format = format->fourcc,
         .width = format->width,
@@ -773,6 +790,13 @@ void ExternalCameraDevice::getFrameRateList(
         .index = 0
     };
 
+    ALOGV("format:%c%c%c%c, w %d, h %d, fpsUpperBound %f",
+        frameInterval.pixel_format & 0xFF,
+        (frameInterval.pixel_format >> 8) & 0xFF,
+        (frameInterval.pixel_format >> 16) & 0xFF,
+        (frameInterval.pixel_format >> 24) & 0xFF,
+        frameInterval.width, frameInterval.height, fpsUpperBound);
+
     for (frameInterval.index = 0;
             TEMP_FAILURE_RETRY(ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frameInterval)) == 0;
             ++frameInterval.index) {
@@ -782,6 +806,9 @@ void ExternalCameraDevice::getFrameRateList(
                         frameInterval.discrete.numerator,
                         frameInterval.discrete.denominator};
                 double framerate = fr.getDouble();
+                if (framerate > format->maxFramerate) {
+                    format->maxFramerate = framerate;
+                }
                 if (framerate > fpsUpperBound) {
                     continue;
                 }
@@ -837,7 +864,7 @@ void ExternalCameraDevice::trimSupportedFormats(
 
     const auto& maxSize = sortedFmts[sortedFmts.size() - 1];
     float maxSizeAr = ASPECT_RATIO(maxSize);
-
+#if 0        //该位置确认自己的camera调用的是哪一个接口
     // Remove formats that has aspect ratio not croppable from largest size
     std::vector<SupportedV4L2Format> out;
     for (const auto& fmt : sortedFmts) {
@@ -855,6 +882,15 @@ void ExternalCameraDevice::trimSupportedFormats(
                 maxSize.width, maxSize.height);
         }
     }
+#else
+    std::vector<SupportedV4L2Format> out;
+        //all enum format added to SupportedFormat
+    ALOGD("%s(%d): don't care ratio of horizontally or vertical ",__FUNCTION__, __LINE__);
+
+    for (const auto& fmt : sortedFmts) {
+        out.push_back(fmt);
+    }
+#endif
     sortedFmts = out;
 }
 
@@ -1007,6 +1043,23 @@ void ExternalCameraDevice::initSupportedFormatsLocked(int fd) {
             mCroppingType = VERTICAL;
         }
     }
+    /* mSupportedFormats has been sorted by size
+       remove the same size format */
+    std::vector<SupportedV4L2Format> tmp;
+    for (int i = 0; i < mSupportedFormats.size(); ) {
+        if ((mSupportedFormats[i+1].width == mSupportedFormats[i].width) &&
+            (mSupportedFormats[i+1].height == mSupportedFormats[i].height)) {
+                if (mSupportedFormats[i+1].maxFramerate > mSupportedFormats[i].maxFramerate)
+                    tmp.push_back(mSupportedFormats[i+1]);
+                else
+                    tmp.push_back(mSupportedFormats[i]);
+                i = i + 2;
+         } else {
+            tmp.push_back(mSupportedFormats[i]);
+            i++;
+         }
+    }
+    mSupportedFormats = tmp;
 }
 
 sp<ExternalCameraDeviceSession> ExternalCameraDevice::createSession(

diff --git a/camera/device/3.4/default/ExternalCameraUtils.cpp b/camera/device/3.4/default/ExternalCameraUtils.cpp
old mode 100644
new mode 100755
diff --git a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h
old mode 100644
new mode 100755
index 341c62218..669a2bf68
--- a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h
+++ b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h
@@ -110,6 +110,7 @@ struct SupportedV4L2Format {
         uint32_t durationDenominator; // frame duration denominator. Ex: 30
         double getDouble() const;     // FrameRate in double.        Ex: 30.0
     };
+    double maxFramerate;    //该补丁若代码中无对应的地方,可修改同级文件ExternalCameraUtils_3.4.h 的相应位置是一样的

     std::vector<FrameRate> frameRates;
 };
 

-- 
2.17.1

此外,修改分辨率问题也可参考如下:

//显示更多拍照分辨率的 改应用代码里这个地方。

private static List<Size> pickUpToThree(List<Size> sizes) {

        List<Size> result = new ArrayList<Size>();

        Size largest = sizes.get(0);

        if (largest.width() != 1920 || largest.height() != 1088)

            result.add(largest);

        Size lastSize = largest;

        for (Size size : sizes) {

            if (size != null && size.width() == 1920 && size.height() == 1088)

                continue;

+            result.add(size);

-            double targetArea = Math.pow(.5, result.size()) * area(largest);

+            /*double targetArea = Math.pow(.5, result.size()) * area(largest);

            if (area(size) < targetArea) {

                // This candidate is smaller than half the mega pixels of the

                // last one. Let's see whether the previous size, or this size

                // is closer to the desired target.

                if (!result.contains(lastSize)

                        && (targetArea - area(lastSize) < area(size) - targetArea)) {

                    result.add(lastSize);

                } else {

                    result.add(size);

                }

            }

            lastSize = size;

            if (result.size() == 3) {

                break;

            }

        }

        // If we have less than three, we can add the smallest size.

        if (result.size() < 3 && !result.contains(lastSize)) {

            result.add(lastSize);

-        }

+        }*/

        return result;

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896500.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漏洞挖掘JS构造新手向

前置思路文章 JS逆向混淆前端对抗 油猴JS逆向插件 JS加解密之mitmproxy工具联动Burp JS挖掘基础 伪协议 JavaScript伪协议是一种在浏览器中模拟网络请求的方法。它使用window.XMLHttpRequest对象或fetch()方法来模拟发送HTTP请求&#xff0c;而不是通过实际的网络请求来获…

【H2O2|全栈】JS入门知识(五)

目录 JS 前言 准备工作 数组API&#xff08;一&#xff09; API概念 数组常见API&#xff08;一&#xff09; arguments 作用域 概念 全局作用域 局部作用域 块级作用域 变量的作用域 作用域链 案例 预解析 概念 变量预解析 函数预解析 案例 对象 概念 …

MySQL 异常: “Host ‘xxx‘ is not allowed to connect to this MySQL server“

update user set host % where user root; FLUSH PRIVILEGES; 这两行代码就行

Mysql 和MongoDB用户访问权限问题

Mysql 刚给二线运维排查了一个问题&#xff0c;Mysql安装完可用&#xff0c;且可用navicat连接&#xff0c;项目中通过127.0.0.1去连数据库报错了。错误是access denied for user ‘root’localhost,排查思路 1. 密码是否正确 &#xff08;不需要重置。到Mysql的安装目录下找…

开发规范 - mac系统1小时装机极速装机开发环境

idea 官网下载&#xff0c;然后想办法破解 idea必备配置 设置自动import IDEA插件安装 idea必备插件 maven helperlombokMybatisX jdk配置 jdk不用单配配置&#xff0c;在idea中&#xff0c;选择一个语言环境&#xff08;jdk8/jdk11/jdk17…&#xff09;,然后默认下载j…

picgo的gitee图床配置

首先picgo默认没有gitee&#xff0c;需要装插件 然后gitee

每月洞察:App Store 和 Google Play 的主要更新

Google Play 和 App Store 的算法不断发展&#xff0c;定期更新和变化会显着影响其功能。对于开发人员和营销人员来说&#xff0c;跟上这些变化至关重要&#xff0c;因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新&#xff0c;解释它…

浏览器实时更新esp32-c3 Supermini http server 数据

一利用此程序的思路就可以用浏览器显示esp32 采集的各种传感器的数据&#xff0c;也可以去控制各种传感器。省去编写针对各系统的app. 图片 1.浏览器每隔1秒更新一次数据 2.现在更新的是开机数据&#xff0c;运用此程序&#xff0c;可以实时显示各种传感器的实时数据 3.es…

关于pdf合并的七个方法,一键批量合并PDF文档,几步搞定!

pdf是一个支持跨平台使用的兼容性极高的文件格式&#xff0c;同时也是我们日常工作中经常接触到的格式之一。然后&#xff0c;在整理大量pdf格式文件时&#xff0c;如果想要将多个pdf合并成一个应该如何实现呢&#xff1f; 其实pdf合并的方法有很多&#xff0c;如果想要快速对p…

Vue request请求拦截 全局拦截Promise后 api请求捕获异常catch

request.js全局拦截响应结果 else if (res.code 40012) { // 权限不足Message({message: res.msg || Error,type: error,duration: 3 * 1000})return Promise.reject(new Error(res.msg || Error))} api请求后加catch捕获异常 sysUserApi.disableById(row.userId).then(re…

边缘计算与联邦学习:探索隐私保护和高效数据处理的结合

个人主页&#xff1a;chian-ocean 文章专栏 边缘计算与联邦学习&#xff1a;探索隐私保护和高效数据处理的结合 1. 引言 随着物联网(IoT)设备的普及&#xff0c;网络边缘产生了大量数据。将这些数据上传至云端进行集中式计算和处理&#xff0c;既有隐私泄露的风险&#xff…

Python编程基础入门:从风格到数据类型再到表达式

前期已经详细介绍了环境搭建&#xff1a;PycharmPython、VsCodePython Python编程基础入门&#xff1a;从风格到数据类型再到表达式 在编写Python程序时&#xff0c;理解其基础结构和语法是每个初学者的必修课。这篇文章将带你深入了解Python的基本编程风格、数据类型、类型转…

consumer 角度讲一下i2c外设

往期内容 I2C子系统专栏&#xff1a; I2C&#xff08;IIC&#xff09;协议讲解-CSDN博客SMBus 协议详解-CSDN博客I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg-CSDN博客内核提供的通用I2C设备驱动I2c-dev.c分析&#xff1a;注册篇内核提供的通用I2C设备驱动I2C-dev.…

02篇 机械考研复试简历保姆级教程,考研简历联系导师邮件复试调剂超全攻略 导师喜欢看到的简历(附模板)

考研复试简历怎么写&#xff1f;导师喜欢看到的简历&#xff08;附模板&#xff09; 复试简历&#xff0c;重要程度max&#xff01;绝非小事一桩&#xff01;它就像是你硬核经历的闪亮外衣&#xff0c;条理清晰、逻辑严谨且设计感十足&#xff0c;一定能在导师心中留下深刻印象…

【新专栏】Excel数据分析与模拟决策-送完整电子版内容

专栏入口&#xff1a;Excel数据分析与模拟决策 购买专栏&#xff0c;即送对应完整版电子书及配套的Excel文件。

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示&#xff1a;学习华为交换机堆叠配置&#xff0c;含堆叠的概念、功能、角色、ID和优先级&#xff1b;堆叠的建立过程以及注意事项&#xff1b;包含堆叠的配置命令&#xff0c;以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…

逻辑移位的学习

逻辑移位&#xff08;Logical Shift&#xff09;是计算机科学中的一种位移操作&#xff0c;它用于将二进制数的位向左或向右移动。逻辑移位的特点是&#xff0c;无论是左移还是右移&#xff0c;移出边界的位都被丢弃&#xff0c;并用零填充空缺的位。逻辑移位适用于无符号数的处…

【C语言】文件操作(2)(文件缓冲区和随机读取函数)

文章目录 一、文件的随机读取函数1.fseek函数2.ftell函数3.rewind函数 二、文件读取结束的判断1.被错误使用的feof2.判断文件读取结束的方法3.判断文件结束的原因feofferror判断文件读取结束原因示例 三、文件缓冲区 一、文件的随机读取函数 在上一篇的文章中&#xff0c;我们讲…

算法笔记day07

1.最长回文子串 最长回文子串_牛客题霸_牛客网 算法思路&#xff1a; 使用中心扩散算法&#xff0c;枚举所有的中点&#xff0c;向两边扩散&#xff0c;一个中点需要枚举两次&#xff0c;一次当回文串是奇数另一次回文串是偶数的情况。 class Solution { public:int getLong…

JRT怎么从IRIS切换到PostGreSql库

1.执行M导出得到建库脚本文件 2.下载生成的脚本到本地D盘 3.修改驱动为PostGreSql 4.修改连接串 5.到PostGreSql里面创建一个jrtlis的数据库&#xff0c;模式为jrt 6.启动网站点击导入脚本按钮 导入完成了就可以正常使用PostGreSql库了