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

NUC980-OLED实现全中文字库的方法

1.背景

有一个产品,客户需要屏幕展示一些内容,要带一些中文,实现了OLED12864的驱动,但是它不带字库,现在要实现OLED全字库的显示

2.制作原始字库

下载软件pctolcd2002

设置

制作字库

打开原始文件

用软件自带的,或者自己去找字

生成字库文件

生成的内容如下

特别注意,保存的文件编码要是UTF-8的,不然后面会有点麻烦

3.转换

自行调整内容,字符"啊"之前的可以不要

目标格式应该是这样的

4.实现OLED驱动接口

oled.c

#include "oled.h"/* ssd1306所对应的I2C控制器的设备节点 */ 
#define SSD1306_DEVICE      "/dev/i2c-0"    /* ssd1306的I2C设备地址 */
#define SSD1306_ADDR    0x3Cuint8_t OLED_Display[128][8];
uint8_t OLED_Display_Cache[128][8];static int oled_fd;/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char command)
{unsigned char buf[2];buf[0] = 0x00;  // 控制字节,0x00表示接下来的字节是命令buf[1] = command;write(oled_fd, buf, 2);
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char data)
{unsigned char buf[2];buf[0] = 0x40;  // 控制字节,0x40表示接下来的字节是数据buf[1] = data;write(oled_fd, buf, 2);
}void OLED_WR_Byte(unsigned dat,unsigned cmd)
{if(cmd){Write_IIC_Data(dat);}else {Write_IIC_Command(dat);}
}/*        设置OLED屏的显示坐标*      X : 表示OLED的水平坐标(0—127)*      Y : 表示OLED的页(0—7)
*/
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{   OLED_WR_Byte(0xb0+(y & 0x0f),OLED_CMD);OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);OLED_WR_Byte((x&0x0f),OLED_CMD); 
}         
//开启OLED显示    
void OLED_Display_On(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ONOLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//关闭OLED显示     
void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}                    
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!     
void OLED_Clear(void)  
{  uint8_t i,n;            for(i=0;i<8;i++)  {  OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示
}/*
函数功能:OLED打点函数
输入参数:点所在坐标 x=0~127 y = 0~63
输出参数:无
用到的全局变量:无
*/
void OLED_Dot(uint8_t x,uint8_t y,uint8_t state)
{if(state)OLED_Display_Cache[x][y>>3] |= 1 << (y%8); elseOLED_Display_Cache[x][y>>3]&= ~(1 << (y%8)); 
}/*
函数功能:OLED刷屏任务
输入参数:OLED显示缓存数组
输出参数:无
用到的全局变量:无
*/
void OLED_Process()
{unsigned char x,y;for(y=0;y<8;y++){                       for(x=0;x<128;x++){   if(OLED_Display[x][y] != OLED_Display_Cache[x][y])  {OLED_Display[x] [y]= OLED_Display_Cache[x][y];      OLED_Set_Pos(x,y);OLED_WR_Byte(OLED_Display[x] [y],OLED_DATA);}}}
}void OLED_Print(uint8_t x, uint8_t y, char *s)
{uint16_t targetIndex = sizeof(CN16_Msk)/35; // 目标汉字的内码printf("targetIndex:%d\r\n",targetIndex);fflush(stdout);uint16_t length = strlen(s);//取字符串总长printf("length:%d\r\n",length);fflush(stdout);uint16_t offset = x;for(uint16_t i=0;i<length;i++){uint8_t first = *(s+i);if(first <= 127){//小于128是ASCII符号for(uint8_t n=0;n<8;n++){OLED_Display_Cache[x+offset][y] = F8X16[first][n]; OLED_Display_Cache[x+offset][y+1] = F8X16[first][8+n+3]; offset++;}}else if(first > 127){//大于127,为汉字uint8_t utf[4];utf[0] = first;i++;utf[1] = *(s+i);i++;utf[2] = *(s+i);for(uint16_t j=0;j<targetIndex;j++){if(utf[0] == CN16_Msk[j][0] && utf[1] == CN16_Msk[j][1] && utf[2] == CN16_Msk[j][2]){for(uint8_t n=0;n<16;n++){OLED_Display_Cache[x+offset][y] = CN16_Msk[j][n]; OLED_Display_Cache[x+offset][y+1] = CN16_Msk[j][16+n+3]; offset++;}}}}}
}//初始化SSD1306                        
void OLED_Init(void)
{   /* 打开ssd1306对应的I2C控制器文件 */oled_fd =open(SSD1306_DEVICE, O_RDWR);if (oled_fd< 0) {printf("open 0x%s failed \n",SSD1306_DEVICE);}/*设置ssd1306的I2C设备地址*/if (ioctl(oled_fd,I2C_SLAVE_FORCE, SSD1306_ADDR) < 0) {            printf("set slave address failed \n");}usleep(50000);OLED_WR_Byte(0xAE,OLED_CMD);//--display offOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address  OLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128   OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelOLED_Clear();
}  int main()
{OLED_Init();OLED_Print(8,2,"123和你啊");OLED_Process();while(1){#if 0 //测试按点刷屏for(uint8_t i=0;i<128;i++){for(uint8_t j=0;j<64;j++){OLED_Dot( i,j,1);OLED_Process();}}#endif}return 0;
}

oled.h

#ifndef __OLED_H
#define __OLED_H                 
//#include "sys.h"
#include "stdlib.h"
#include <stdint.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <string.h>#include "oledfont.h"  #define OLED_MODE 0
#define SIZE 8
#define XLevelL     0x00
#define XLevelH     0x10
#define Max_Column  128
#define Max_Row     64
#define Brightness  0xFF 
#define X_WIDTH     128
#define Y_WIDTH     64                                
//-----------------OLED IIC端口定义----------------                                  
#define OLED_CMD  0 //写命令
#define OLED_DATA 1 //写数据//OLED控制用函数
void OLED_Display_On(void);
void OLED_Display_Off(void);                                            
void OLED_Init(void);
void OLED_Clear(void);#endif  

5.字库调整

利用python把ascii编码改为utf8编码

with open('input.txt', 'r', encoding='utf-8') as input_file:with open('output.txt', 'w', encoding='utf-8') as output_file:for line in input_file:char = line.strip()utf8_byte = char.encode("utf-8")hex_str = ", ".join([f"0x{x:02x}" for x in utf8_byte])output_file.write(hex_str + "\n")

输入文件是

输出信息是

截取字库片段

#ifndef __OLEDFONT_H
#define __OLEDFONT_H        /****************************************8*16的点阵************************************/
const unsigned char F8X16[][16]=      
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00},/*"%",37*/
{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x2C,0x19,0x27,0x21,0x10},/*"&",38*/
{0x00,0x12,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",39*/
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},/*"(",40*/
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},/*")",41*/
{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",42*/
{0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01},/*"+",43*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x70,0x00,0x00,0x00,0x00,0x00},/*",",44*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"-",45*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",46*/
{0x00,0x00,0x00,0x00,0xC0,0x38,0x04,0x00,0x00,0x60,0x18,0x07,0x00,0x00,0x00,0x00},/*"/",47*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",48*/
{0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},/*"1",49*/
{0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",50*/
{0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",51*/
{0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24},/*"4",52*/
{0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00},/*"5",53*/
};// typedef struct {
//     // unsigned char Index[3];  // 汉字UTF-8内码
//     // unsigned char Msk[32];  // 字模
//     unsigned char Msk[35];
// } __attribute__((packed)) GB2312_GB16_t;const unsigned char CN16_Msk[][35]={
{0xe5, 0x95, 0x8a,0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00},/*'啊',1410*/
{0xe9, 0x98, 0xbf,0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0xF2,0x12,0x12,0xF2,0x02,0xFE,0x02,0x02,0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0x0F,0x04,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00},/*'阿',1411*/
{0xe5, 0x9f, 0x83,0x20,0x20,0xFF,0x20,0x20,0x10,0x98,0xF4,0x92,0x91,0x90,0x94,0x98,0x30,0x00,0x00,0x10,0x30,0x1F,0x08,0x88,0x85,0x44,0x24,0x14,0x0F,0x14,0x24,0x44,0x84,0x84,0x00},/*'埃',1412*/
{0xe6, 0x8c, 0xa8,0x10,0x10,0xFF,0x10,0x00,0x10,0x98,0xF4,0x92,0x91,0x90,0x94,0x98,0x30,0x00,0x00,0x42,0x82,0x7F,0x01,0x84,0x85,0x44,0x24,0x14,0x0F,0x14,0x24,0x44,0x84,0x84,0x00},/*'挨',1413*/
{0xe5, 0x93, 0x8e,0x00,0xFC,0x04,0x04,0xFC,0x00,0xC4,0x1F,0x04,0x04,0x04,0x1F,0xC4,0x04,0x00,0x00,0x00,0x0F,0x04,0x04,0x8F,0x80,0x40,0x23,0x14,0x08,0x14,0x23,0x40,0x80,0x80,0x00},/*'哎',1414*/
{0xe5, 0x94, 0x89,0xFC,0x04,0x04,0xFC,0x00,0x10,0x98,0xF4,0x92,0x91,0x90,0x94,0x98,0x30,0x00,0x00,0x1F,0x08,0x08,0x1F,0x84,0x85,0x44,0x24,0x14,0x0F,0x14,0x24,0x44,0x84,0x84,0x00},/*'唉',1415*/
};
#endif

6.显示效果

7.优化

上面的代码,存在一个问题是,Y轴的步进必须是8个点,需要优化为任意位置的显示

void OLED_Dot_Line(uint8_t x, uint8_t y, uint8_t temp)
{for(uint8_t i=0;i<8;i++){       if(temp&0x01)   {OLED_Dot(x,y,1);}  else{OLED_Dot(x,y,0);}temp = temp>>1;y++;if(y>=64)return;    //超区域了}    
}void OLED_Print(uint8_t x, uint8_t y, char *s)
{uint16_t targetIndex = sizeof(CN16_Msk)/35; // 目标汉字的内码uint16_t length = strlen(s);//取字符串总长// printf("length:%d\r\n",length);// fflush(stdout);uint16_t offset = x;for(uint16_t i=0;i<length;i++){uint8_t first = *(s+i);if(first <= 127){//小于128是ASCII符号for(uint8_t n=0;n<8;n++){OLED_Dot_Line(x+offset,y,F8X16[first][n]);OLED_Dot_Line(x+offset,y+8,F8X16[first][n+8]);offset++;}}else if(first > 127){//大于127,为汉字uint8_t utf[4];utf[0] = first;i++;utf[1] = *(s+i);i++;utf[2] = *(s+i);for(uint16_t j=0;j<targetIndex;j++){if(utf[0] == CN16_Msk[j][0] && utf[1] == CN16_Msk[j][1] && utf[2] == CN16_Msk[j][2]){for(uint8_t n=0;n<16;n++){OLED_Dot_Line(x+offset,y,CN16_Msk[j][n+3]);OLED_Dot_Line(x+offset,y+8,CN16_Msk[j][n+16+3]);offset++;}}}}}
}

相关文章:

NUC980-OLED实现全中文字库的方法

1.背景 有一个产品&#xff0c;客户需要屏幕展示一些内容&#xff0c;要带一些中文&#xff0c;实现了OLED12864的驱动&#xff0c;但是它不带字库&#xff0c;现在要实现OLED全字库的显示 2.制作原始字库 下载软件pctolcd2002 设置 制作字库 打开原始文件 用软件自带的&…...

UEFI 启动原理及qemu 虚拟化中使用

UEFI 启动原理及qemu 虚拟化中使用 什么是BIOS&#xff1f;什么是 UEFI&#xff1f; 什么是BIOS&#xff1f; 计算机启动时会加载 BIOS&#xff0c;以初始化和测试硬件功能。它使用 POST 或 Power On Self Test 来确保硬件配置有效且工作正常&#xff0c;然后寻找存储引导设…...

35、正则表达式

一、正则表达式命令 正则表达式&#xff1a;匹配的是文本内容&#xff0c;linux的文本三剑客都是针对文本内容。 ​ grep 过滤文本内容 ​ sed 针对文本内容进行增删改查 ​ awk 按行取列 文本三剑客----都是按照行进行匹配。 1.1、grep筛选&#xff1a; grep的作用就是…...

Ubuntu20.04中复现FoundationPose

Ubuntu20.04中复现FoundationPose 文章目录 Ubuntu20.04中复现FoundationPose1.安装cuda和cudnn2.下载相关资源3.环境配置4.运行model-based demo5.运行ycbv demoReference &#x1f680; 非常重要的环境配置 &#x1f680; ubuntu 20.04cuda 11.8.0cudnn v8.9.7python 3.9.19…...

【Qt快速入门(四)】- QLabel文本框的使用

目录 Qt快速入门&#xff08;四&#xff09;- QLabel文本框的使用QLabel文本框的使用QLabel的基本用法1. 创建和设置文本2. 动态设置文本 设置文本样式1.设置字体和颜色2.文本对齐方式3.富文本显示 显示图片QLabel的交互功能可点击标签 QLabel的高级特性1.缩放图片以适应标签大…...

用Python设置Excel工作表网格线的隐藏与显示

Excel表格界面的直观性很大程度上得益于表格中的网格线设计&#xff0c;这些线条帮助用户精确对齐数据&#xff0c;清晰划分单元格。网格线是Excel界面中默认显示的辅助线&#xff0c;用于辅助定位&#xff0c;与单元格边框不痛&#xff0c;不影响打印输出。然而&#xff0c;在…...

自回归模型胜过扩散模型:用于可扩展图像生成的 Llama

&#x1f4dc; 文献卡 Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation作者: Peize Sun; Yi Jiang; Shoufa Chen; Shilong Zhang; Bingyue Peng; Ping Luo; Zehuan YuanDOI: 10.48550/arXiv.2406.06525摘要: We introduce LlamaGen, a new family …...

访问外网的安全保障——反向沙箱

反向沙箱作为一种网络安全技术&#xff0c;其核心理念在于通过构建一个隔离且受控的环境&#xff0c;来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中&#xff0c;如何借助反向沙箱实现安全上网&#xff0c;已成为众多用户关注的焦点。 随着信息化的发…...

【绝对有用】C++ 字符串进行排序、vector增加内容 和 剔除值

在 C 中对字符串进行排序&#xff0c;可以使用标准库中的 std::sort 函数。std::sort 函数可以用于容器或范围内的元素排序&#xff0c;包括字符串中的字符。以下是一个简单的示例代码&#xff0c;展示了如何对字符串中的字符进行排序&#xff1a; #include <iostream> …...

GenICam标准(一)

系列文章目录 GenICam标准&#xff08;一&#xff09; GenICam标准&#xff08;二&#xff09; GenICam标准&#xff08;三&#xff09; GenICam标准&#xff08;四&#xff09; GenICam标准&#xff08;五&#xff09; GenICam标准&#xff08;六&#xff09; 文章目录 系列文…...

【Redis】分布式锁基本理论与简单实现

目录 分布式锁解释作用特性实现方式MySQL、Redis、Zookeeper三种方式对比 原理 reids分布式锁原理目的容错redis简单分布式锁实现锁接口实现类下单场景的实现容错场景1解决思路优化代码 容错场景2Lua脚本Redis利用Lua脚本解决多条命令原子性问题 释放锁的业务流程Lua脚本来表示…...

Web开发技术大作业(HTML\CSS\PHP\MYSQL\JS)

从6月13日到6月15日&#xff0c;经过一系列的操作&#xff0c;终于把老师布置的大作业写完了&#xff0c;虽然有很多水分&#xff0c;很多东西都是为了应付&#xff08;特别是最后做的那几个网页&#xff09;&#xff0c;真的是惨不忍睹&#xff0c;不过既然花时间写了&#xf…...

【全开源】沃德会务会议管理系统(FastAdmin+ThinkPHP+Uniapp)

沃德会务会议管理系统一款基于FastAdminThinkPHPUniapp开发的会议管理系统&#xff0c;对会议流程、开支、数量、标准、供应商提供一种标准化的管理方法。以达到量化成本节约&#xff0c;风险缓解和服务质量提升的目的。适用于大型论坛、峰会、学术会议、政府大会、合作伙伴大会…...

尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】

视频地址&#xff1a;一套上手ClickHouse-OLAP分析引擎&#xff0c;囊括Prometheus与Grafana_哔哩哔哩_bilibili 01_尚硅谷大数据技术之ClickHouse入门V1.0 尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】尚硅谷大数据技术ClickHouse教程-笔记02【表引…...

生产管理系统看板,在自动化设备领域的创新应用

在自动化设备领域&#xff0c;生产管理系统看板的创新应用是一项引人注目的技术进步。以广州某自动化设备有限公司为例&#xff0c;他们是一家涂装工程设备制造企业&#xff0c;将讯鹏生产管理系统电子看板成功应用于全自动立式静电喷粉线、卧式静电喷粉线、氟碳喷涂生产线等领…...

分享一个图片转换工具XnConvert

目录 stablediffusion3 生成图片效果图图片转换工具XnConvertpixzip stablediffusion3 生成图片效果图 今天在使用stablediffusion3时&#xff0c;尝试生成了几张Java的图片&#xff0c;发现确实很好看&#xff0c;文生图的效果超出我的预期&#xff0c;忍不住想要给自己的csd…...

Nginx后端超时504重复请求

在一次业务中客户端请求osb平台再经过nginx转发后端&#xff0c;开发反馈请求次数大于1导致问题&#xff0c;经排查客户端请求一次&#xff0c;osb平台设置超时为30s&#xff0c;nginx配置等待上游服务器响应时最多等待30秒 部分配置文件 upstream xx {server 10.6.6.1:8080 w…...

环境配置04:Pytorch下载安装

说明&#xff1a; 显存大于4G的建议使用GPU版本的pytorch&#xff0c;低于4G建议使用CPU版本pytorch&#xff0c;直接使用命令安装对应版本即可 GPU版本的pytorch的使用需要显卡支持&#xff0c;需要先安装CUDA&#xff0c;即需要完成以下安装 1.查看已安装CUDA版本 GPU对应…...

【杂记-浅谈私有地址】

私有地址 一、私有IP地址概述1、私有IP地址的实用性2、私有IP地址的局限性 二、私有IP地址范围1、A类私有地址2、B类私有地址3、C类私有地址 三、私有IP地址与公网IP地址的区别 一、私有IP地址概述 私有IP地址是互联网工程任务组&#xff08;IETF&#xff09;为组织机构内部使…...

Java基础学习-数组

目录 数组定义 注意点&#xff1a; 地址值是数组在内存中实际存储的地址。 案例遍历&#xff1a;遍历数组得到每一个元素&#xff0c;求数组里面所有数据和 案例&#xff1a;定义数组&#xff0c;遍历能被3整除的数字 案例&#xff1a;遍历一个数组&#xff0c;奇数将当前…...

爬虫 pandas Linux Flume Pig填空题

目录 试卷&#xff1a;Python网络数据处理 答案 试卷&#xff1a;Pandas基础操作 答案 试卷&#xff1a;Linux基础指令 答案 试卷&#xff1a;Apache Flume基础指令 答案 试卷&#xff1a;Apache Pig基础指令 答案&#xff1a; Hadoop题 答案 试卷&#xff1a;Pyth…...

Spring框架中哪些地方使用了反射

Spring框架中哪些地方使用了反射&#xff1f; 1. 依赖注入&#xff1a;Spring 使用反射机制获取对象并进行属性注入&#xff0c;从而实现依赖注入。 2. AOP&#xff1a;Spring AOP 使用 JDK 动态代理或者 CGLIB 字节码增强技术来实现 AOP 的切面逻辑&#xff0c;这其中就包含…...

难辨真假的Midjourney案例(附提示词):适合练手

人物 时尚女孩 Street style fashion photo, full-body shot of a young Chinese woman with long curly black hair, walking confidently with a crowd of people down a sidewalk in Hong Kong, wearing a emerald green Gucci maxi dress & gold jewelry, sunset lig…...

数据库讲解---(数据库保护)【上】

一.事务 1.1事务的概念【重要】 事务&#xff1a;“将一组数据库操作打包起来形成一个逻辑独立的单元&#xff0c;这个工作单元不可分割&#xff0c;其中包含的数据要么全部都发生&#xff0c;要么全部都不发生”。 在SQL中&#xff0c;界定事务的语句有三条&#xff1a; B…...

【Android】【Compose】Compose的简单介绍

前言 Jetpack Compose 是谷歌推出的用于构建现代化 Android 应用界面的工具包。它采用了声明式的方式来定义用户界面&#xff0c;与传统的 XML 布局和视图层次结构相比&#xff0c;Compose 提供了更直观、更简洁的方式来创建和管理界面组件。 需求配置 Android 版本要求 An…...

对接钉钉Stream模式考勤打卡相关事件的指南

钉钉之前的accessToken是公司级别的&#xff0c;现在的accessToken是基于应用的&#xff0c;接口的权限也是基于应用的。所以第一步是在钉钉开放平台&#xff08;https://open-dev.dingtalk.com/&#xff09;创建一个应用。 创建好应用之后&#xff0c;因为我们后续还需要调用钉…...

CRMEB PRO企业微信通讯录配置

企业微信通讯录配置 登录企业微信管理后台 企业微信 1、点击【管理工具】找到【通讯录同步】点击进入 2、点击【开启API接口同步】 进入设置【通讯录同步】页面后&#xff0c;权限一栏&#xff0c;勾选【API编辑通讯录】勾选【开启手动编辑】&#xff1b; 3、点击下图箭头所…...

直播新篇章 | 金仓数据库“零距离”探索与知识挑战双重奏

KING大咖成就计划 全新进阶&#xff01;&#xff01;&#xff01;携手知识竞答挑战赛震撼来袭~为您带来一场别开生面的金仓数据库探索之旅与知识竞答盛宴&#xff01; 直 播 活 动 01 大咖引领&#xff0c;KING BASE产品“零距离”体验 您是否对金仓数据库充满好奇&#x1f9d0…...

List的介绍

1. 什么是List List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法。 Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进行遍历。 2. 常见接口介绍 List中提供了好的方法&#x…...

Uniapp获取具体地理位置

使用uniapp自带uni.getLocation获取当前定位经纬度 再调用高德逆地理编码API&#xff0c;查到具体位置信息 https://restapi.amap.com/v3/geocode/regeo?location${longitude},${latitude}&key${key}&extensionsall 但是个人申请的key&#xff0c;有配额限制 最多每…...

青岛网站制作价格/网络广告有哪些形式

锁相环是一个能对输入信号进行自动跟踪的负反馈控制电路。锁相环在通信、无线电电子学、自动控制和电力系统自动化等领域得到了极为广泛的应用&#xff0c;其性能的好坏将直接影响整个电子系统的工作性能[1]。随着数字技术的不断发展&#xff0c;全数字锁相环的应用范围也更加广…...

javaweb可以做网站吗/品牌营销策划方案怎么做

1、打开激活窗口 2、选择 Activate new license with License server &#xff08;用license server 激活&#xff09; 3、在 License sever address 处填入 https://jetlicense.nss.im/ 4、点击 Activate 进行认证 还有一种方法比较麻烦&#xff0c;就不提及了...

谷歌浏览器 安卓下载/黄山搜索引擎优化

要分析Spring 源码&#xff0c;首先就要从 Spring 最为熟悉的 IOC 容器入手。既然要分析 Spring IOC 源码&#xff0c;那么我们就先来讨论以下几个问题&#xff1a;①什么是 IOC&#xff1f; ② IOC 能帮我们做哪些事情&#xff1f; 1.什么是 IOC 控制反转&#xff08;Invers…...

企业数字化转型/百度seo找哪里

为了规范等保相关业务办理流程&#xff0c;确保等保业务顺利办理&#xff0c;保障企业合法权益&#xff0c;政策规定&#xff0c;只有取得等保测评资质机构方可办理等保测评业务。因此很多人在问&#xff0c;企业是否具备等保测评资质在哪里查&#xff1f;怎么查&#xff1f; …...

昆明专业网站建设/热门国际新闻

Hash冲突&#xff0c;当2个不同的元素的Key通过Hash()算法得到相同的目标地址时&#xff0c;发生Hash冲突 主流的解决方法有&#xff1a; ——开放地址法 这种方法也称再散列法&#xff0c;其基本思想是&#xff1a;当关键字key的哈希地址pH&#xff08;key&#xff09;出现…...

像芥末堆做内容的网站/百度推广优化中心

在上一篇中&#xff0c;我们讲到了如何配置多个容器并且定制属于自己的镜像&#xff0c;但是容器的数据性能以及持久如何保证的&#xff1f;本篇将通过介绍Docker Volume来说明这个问题&#xff0c;涉及到的架构如下图所示&#xff1a;1、 说到Volume实际上有多种方式可以实现&…...