DIY蓝牙键盘(2) - 理解HID报文描述符
1. 前情回顾
上篇主要讲了键盘报文的分类与格式,并留下了一个问题:那主机为什么知道我这些报文的格式?那肯定是主机要提前知道我们发的报文的格式,那么问题就变成了:在发送报文前我们要怎么通知主机,让它知道我们报文的格式。
这篇将回答这个问题,主机如何知道键盘报文的格式。答案就是键盘将发送HID report descriptor(HID报文描述符)给主机,主机根据HID描述符就知道键盘的报文格式。
2. HID 报文描述符简介
我们先理解一下逻辑:
(1) 键盘通过发送报文描述符给主机,告诉主机它后面发出来的报文的格式
(2) 主机通过解析报文描述符,从而知道了键盘后面要发的报文的格式
(3) 键盘发送报文给主机
(4) 主机已经知道了报文的格式,收到报文后根据报文的内容做出相应的动作
这里隐含了一个问题:键盘发送的报文描述符,主机为什么能解析?
因为这个报文描述符是USB协会定义的,所有的主机都支持USB协会定义的这个描述符。从这也能感受到USB协会的强大,所有的主机都支持USB定义的HID报文描述符!!!这里的主机包括:Windows主机,macOS主机,Android主机等,总之是所有主机都支持。
于是我们的问题变成,怎么按照我们的报文格式写出对应的HID报文描述符?那自然就是要仔细阅读下面这两篇HID报文描述符相关的文档:
(1) HID描述符介绍: Microsoft Word - HID1_11.doc (usb.org)
(2) HID Usage表:https://usb.org/sites/default/files/hut1_22.pdf
对于初学者来说,直接上手这两篇文档很不友好,因为这两篇文档看起来比较吃力。当然功力扎实的朋友,直接从这两篇文档入手也是可以的。
为了让初学都抓住主干,我决定按我的理解给各位来个简单的入门。
3. HID报文描述符的结构
0 | 报文描述符 | 描述 |
---|---|---|
1 | Usage Page (0x01), | Generic Desktop Usage Page |
2 | Usage (0x06), | Keyboard Usage |
3 | Collection (Application), | 集合开始 |
4 | Report Id(1), | Report Id, 集合的报文都必须有一个report id |
5 | Report Size (8), | 报文的大小,它的单位是一个bit。这里为8表示1个字节 |
6 | Report Count (4), | 报文的个数,上面的报文大小为一个字节,这里个数为4,就表示整个报文的长度为4个字节 |
7 | Usage Page (7), | 下面的报文usage在哪个usage page |
8 | Usage Minimum (0), | usage的最小值 |
9 | Usage Maximum (0xDD), | usage的最大值 |
10 | Logical Minimum (0), | 逻辑的最小值 |
11 | Logical Maximum (0xFF), | 逻辑的最大值 |
12 | Input (Data, Variable, Absolute), | 报文的类型,键盘是把数据上报给主机,当然是input报文。 |
13 | End Collection | 集合结束 |
以上就是HID报文描述符的结构,基本上一个HID报文描述符都必须包含以上的这些元素。但我估计初学都看完还是一头雾水,下面我将带大家自上而下理解这个报文。
3.1 HID TLC 描述
第1、2、3行组成一个TLC(Top Level Collection), 这个TLC是用来让主机加载相应的驱动的。也就是说主机收到前3行的数据后,它会在设备管理器里生成一个设备结点,并把键盘的驱动挂到这个结点上。于是我们在主机上会看到下面中红框圈起来的结点,而且结点上已经加载了一个键盘驱动。是不是很简单,用3行描述符就可以让主机生成一个设备结点,并加载一个驱动到这个结点上。
以这个例子为例,主机已经创建了键盘结点并加载了键盘驱动,那么以后收到report id为1的报文,都由这个结点的键盘驱动来进行解析。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPpJPJFx-1635581808785)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211030115435849.png)]
稍微拓展一下,如果我要让主机生成一个鼠标的设备结点,那要怎么写描述符。根据(https://usb.org/sites/default/files/hut1_22.pdf)第30页的描述。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00mJZ9Xy-1635581808787)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211030132857916.png)]
鼠标的HID TLC描述如下表,我们只需要把usage page的值改为1, usage改为2就可以了。
0 | 报文描述符 | 描述 |
---|---|---|
1 | Usage Page (0x01), | Generic Desktop Usage Page |
2 | Usage (0x02), | Mouse Usage |
3 | Collection (Application), | 集合开始 |
所以如果我们要写一个写一个TLC, 重点就是要学会查表。 所有的HID usage page/usage都可以在(https://usb.org/sites/default/files/hut1_22.pdf)查到。比如我们要查一个keypad的TLC, 按下面的步骤来:
(1) 查找到"usage name"为keypad, 然后"usage types" 为CA的
(2) 然后我们找到Generic Desktop Page (0x01), Keypad(0x07)
(3) 写TLC
0 | 报文描述符 | 描述 |
---|---|---|
1 | Usage Page (0x01), | Generic Desktop Usage Page |
2 | Usage (0x07), | KeypadUsage |
3 | Collection (Application), | 集合开始 |
3.2 HID Report Id
在报文描述符的第4行有一个report id, 这个report id就代表这一组的报文。 上面的报文report id为1, 主机如果收到report id是1的话,它就知道它收到的报文是一个键盘的report. 总之一句话,report id跟这个TLC(或是说这个报文)是绑定在一起的。
所以键盘发给主机的内容除了报文,还需要发给主机一个report id. 以上一篇介绍的报文为例,按下按键A, 键盘发给主机的报文应该为:
其中Byte 0表示report id, Byte 2表示字母A的usage数值。
Byte 0 | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 |
---|---|---|---|---|---|
0x01 | 0x00 | 0x04 | 0x00 | 0x00 | 0x00 |
3.3 Report Size / Report Count
一个报文里面可以包括多种数据类型,比如上篇说听qwerty key和modifier key. qwerty key我们用4个字节来表示,用4个字节就是表示说同一个报文里可以向主机发送4个qwerty key. 那怎么与report size 与 report count对应起来呢?
(1) Report Size: 一个qwerty key我们想用一个字节来表示,于是report size要设为8. 因为report size的单位是1 bit.
(2) Report Count: 一个report里有4个qwerty key, 因此report count就是4.
我们可以类比为, report size就是数组的元素的大小,report count就是数组元素的个数。
我们来举一反三: 如何设置modifer key的 report size与 report count?
先来回顾一下上篇的内容, modifer key我们希望按如下的格式.
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|
R Win | R Shift | R Alt | R Ctrl | L Win | L Shift | L Alt | L Ctrl |
因为一个modifier key使用一个bit来表示,因此report size设置为1。 总共有8个modifier key, 因此report count设置为8.
3.4 Usage Min / Usage Max
在说usage之前,需要搞清楚usage与usage page的关系。 一个usage page里面有很多个usage, 不同的usage page里面的usage的值是可以相同的。因此在谈到usage的时候,要先指定usage page, 不然主机无法解析这个usage.
上表的第7-9行,就是用来表示usage. 首先它先指定usage page(0x07). 通过查表知道,它属于keyboard/keypad的page. (https://usb.org/sites/default/files/hut1_22.pdf)第82页。
然后第8-9行指定了usage的最小值与最大值,这有什么用?
7 | Usage Page (7), | 下面的报文usage在哪个usage page |
---|---|---|
8 | Usage Minimum (0), | usage的最小值 |
9 | Usage Maximum (0xDD), | usage的最大值 |
在上一篇里提到,我们用4个字节来表示4个qwerty key, 每个字节可用来表示一个qwerty key, 也就是每一个字节的值就是一个qwerty key的usage的值。 这里的Usage Minimum/Usage Maximum就表示这每一个字节的值的范围,即它的有效值是 0 - 0xDD.
为什么把值设定为0 - 0xDD呢? 查表知道, 0x00 - 0xDD已经能表示所以键盘的qwerty key的usage值了。
3.5 Logic Min / Logic Max
上表的第10-11行,表示每个字节的范围,这个可以和Usage Minimum/Usage Maximum设置成一样,即0 - 0xDD。但设置为0 - 0xFF, 因为一个字节可以表示的最大范围就是0 - 0xFF。
10 | Logical Minimum (0), | 逻辑的最小值 |
---|---|---|
11 | Logical Maximum (0xFF), | 逻辑的最大值 |
3.6 Data Type
上表第12行用来表示报文数据的类型,键盘的报文数据有modifer key和qwerty key, 这两种数据都是键盘要发送给主机的,因此是input报文。如果是主机发给键盘的,而是output报文。另外qwerty key和modifier是用无符号数来表示的,因此是absolute属性。
12 | Input (Data, Variable, Absolute), | 报文的类型,键盘是把数据上报给主机,当然是input报文。 |
---|
3.7 End Collection
一个集合的结束必须要加上end collection, 它与上表的第3行的collection必须是成对出现的。
4. 构建键盘的HID报文描述符
有了上面的知识基础,我们就可以来构建键盘的报文描述符了。我们希望编写一个HID报文描述符,让主机解析我们的报文格式如下:
Byte 0 | Byte 1 | Byte 2 - 5 |
---|---|---|
Report Id | Modifier key | Qwerty Key |
Modifier key格式如下:
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|
R Win | R Shift | R Alt | R Ctrl | L Win | L Shift | L Alt | L Ctrl |
4.1 编写一个键盘的TLC
通过文档(https://usb.org/sites/default/files/hut1_22.pdf)查找到键盘的usage page为0x01, usage为0x06, 于是TLC的描述符如下:
0 | 报文描述符 | 描述 |
---|---|---|
1 | Usage Page (0x01), | Generic Desktop Usage Page |
2 | Usage (0x06), | Keyboard Usage |
3 | Collection (Application), | 集合开始 |
4 | Report Id(1) | 键盘报文的report id |
5 | End Collection | 集合结束 |
4.2 编写Modifier key描述符
(1) Report Size: 每个modifier key用一个bit来表示,因此report size为1.
(2) Report Count: 总共有8个modifier key,因此report count为8
(3) Usage Page: 0x07, Usage Minimum: 0xE0, Usage Maximum: 0xE7
通过文档(https://usb.org/sites/default/files/hut1_22.pdf) 搜索“LeftControl” 可以查到8个modifer key在usage page 7, usage 范围0xE0 - 0xE7.
(4) Logic Minimum: 0, Logic Maximum: 1
因为每个元素为1个bit, 最小值是0, 最大值是1。
于是得到modifier key的描述符如下:
0 | 报文描述符 | 描述 |
---|---|---|
1 | Report Size (1), | 一个报文元素的大小,它的单位是一个bit |
2 | Report Count (8), | 报文的个数,上面的报文大小为一个字节,这里个数为8,就表示整个报文的长度为8个bit |
3 | Usage Page (7), | 下面的报文usage在哪个usage page |
4 | Usage Minimum (0xE0), | usage的最小值 |
5 | Usage Maximum (0xE7), | usage的最大值 |
6 | Logical Minimum (0), | 逻辑的最小值 |
7 | Logical Maximum (1), | 逻辑的最大值 |
8 | Input (Data, Variable, Absolute), | 数据类型为输入 |
4.3编写Qwerty key描述符
(1) Report Size: 每个qwerty key用一个byte来表示,因此report size为8.
(2) Report Count: 一个report里面总共有4个qwerty key,因此report count为4
(3) Usage Page: 0x07, Usage Minimum: 0x04, Usage Maximum: 0xDD
通过文档(https://usb.org/sites/default/files/hut1_22.pdf) 搜索“Keyboard a and A” 可以查到键盘qwerty key在usage page 7, usage 范围0x04 - 0xDD.
(4) Logic Minimum: 0, Logic Maximum: 0xFF
因为每个元素为1个byte, 最小值是0, 最大值是0xFF。
于是得到modifier key的描述符如下:
0 | 报文描述符 | 描述 |
---|---|---|
1 | Report Size (8), | 一个报文元素的大小,它的单位是一个bit |
2 | Report Count (4), | 报文的个数,上面的报文大小为一个字节,这里个数为4,就表示整个报文的长度为4个字节 |
3 | Usage Page (7), | 下面的报文usage在哪个usage page |
4 | Usage Minimum (0x04), | usage的最小值 |
5 | Usage Maximum (0xDD), | usage的最大值 |
6 | Logical Minimum (0), | 逻辑的最小值 |
7 | Logical Maximum (0xFF), | 逻辑的最大值 |
8 | Input (Data, Variable, Absolute), | 数据类型为输入 |
4.4 整合所有的描述符
把上面的TLC 描述符, modifer key描述符, qwerty的描述符组合起来如下:
0 | 报文描述符 | 描述 |
---|---|---|
1 | Usage Page (0x01), | Generic Desktop Usage Page |
2 | Usage (0x06), | Keyboard Usage |
3 | Collection (Application), | 集合开始 |
4 | Report Id(1) | 键盘报文的report id |
5 | Report Size (1), | 一个报文元素的大小,它的单位是一个bit |
6 | Report Count (8), | 报文的个数,上面的报文大小为一个字节,这里个数为8,就表示整个报文的长度为8个bit |
7 | Usage Page (7), | 下面的报文usage在哪个usage page |
8 | Usage Minimum (0xE0), | usage的最小值 |
9 | Usage Maximum (0xE7), | usage的最大值 |
10 | Logical Minimum (0), | 逻辑的最小值 |
11 | Logical Maximum (1), | 逻辑的最大值 |
12 | Input (Data, Variable, Absolute), | 数据类型为输入 |
13 | Report Size (8), | 一个报文元素的大小,它的单位是一个bit |
14 | Report Count (4), | 报文的个数,上面的报文大小为一个字节,这里个数为8,就表示整个报文的长度为8个bit |
15 | Usage Page (7), | 下面的报文usage在哪个usage page |
16 | Usage Minimum (0x04), | usage的最小值 |
17 | Usage Maximum (0xDD), | usage的最大值 |
18 | Logical Minimum (0), | 逻辑的最小值 |
19 | Logical Maximum (0xFF), | 逻辑的最大值 |
20 | Input (Data, Variable, Absolute), | 数据类型为输入 |
21 | End Collection | 集合结束 |
5. 描述符宏
键盘要发给主机的描述符是应该是一些整形数据才对,怎么上面的描述符是一些字符串加数字呢?
这主要是为了让大家好容易读与理解,比如说看到Report Id(1),就知道希望表示report id为1.其实Report Id是一个宏,最终发给主机的时候需要把这些宏展开的。
描述符宏 | 展开宏后的值 |
---|---|
Report Id(1) | 0x85, 0x01, |
Report Size (1), | 0x75, 0x01 |
Report Count (8), | 0x95, 0x08 |
Usage Page (7), | 0x06, 0x07 |
Usage Minimum (0xE0), | 0x19, 0xE0 |
Usage Maximum (0xE7), | 0x29, 0xE8 |
Logical Minimum (0), | 0x15, 0x00 |
Logical Maximum (1), | 0x25, 0x01 |
Input (Data, Variable, Absolute), | 0x81, 0x00 |
我们在这篇最前面提到要看两篇文档,其中一篇 Microsoft Word - HID1_11.doc (usb.org)。 里面主要就是跟你讲report id, report count这些表要怎么表示。对于我们初学都来说,只要有像“Report Id, Report Count”这些宏可以使用,那就撇开这篇HID文档的介绍了。当然如果你要深入的话,肯定是要把这个文档啃几遍的。
这里我把一些常用的HID描述符的宏列在这里方便大家使用。
#define Physical (0x00U)
#define Undefined (0x00U)
#define Application (0x01U)
#define Logical (0x02U)#define Data_Arr_Abs (0x00U)
#define Const_Arr_Abs (0x01U)
#define Data_Var_Abs (0x02U)
#define Const_Var_Abs (0x03U)
#define Data_Var_Rel (0x06U)
#define Data_Var_Abs_Null (0x42U)
#define BuffBytes (0x01U)#define HID_REPORT_ID(a) 0x85U,(a)
#define HID_USAGE(a) 0x09U,(a)
#define HID_USAGE_SENSOR_DATA(a,b) (a)|(b) #define HID_COLLECTION(a) 0xA1U,(a)
#define HID_REPORT_SIZE(a) 0x75U,(a)
#define HID_REPORT_COUNT(a) 0x95U,(a)
#define HID_REPORT_COUNT_16(a,b) 0x96U,(a),(b)
#define HID_UNIT_EXPONENT(a) 0x55U,(a)
#define HID_UNIT(a) 0x65U,(a)#define HID_USAGE_8(a) 0x09U,(a)
#define HID_USAGE_16(a,b) 0x0AU,(a),(b)#define HID_USAGE_PAGE_8(a) 0x05U,(a)
#define HID_USAGE_PAGE_16(a,b) 0x06U,(a),(b)#define HID_USAGE_MIN_8(a) 0x19U,(a)
#define HID_USAGE_MIN_16(a,b) 0x1AU,(a),(b)#define HID_USAGE_MAX_8(a) 0x29U,(a)
#define HID_USAGE_MAX_16(a,b) 0x2AU,(a),(b)#define HID_LOGICAL_MIN_8(a) 0x15U,(a)
#define HID_LOGICAL_MIN_16(a,b) 0x16U,(a),(b)
#define HID_LOGICAL_MIN_32(a,b,c,d) 0x17U,(a),(b),(c),(d)#define HID_LOGICAL_MAX_8(a) 0x25U,(a)
#define HID_LOGICAL_MAX_16(a,b) 0x26U,(a),(b)
#define HID_LOGICAL_MAX_32(a,b,c,d) 0x27U,(a),(b),(c),(d)#define HID_PHYSICAL_MIN_8(a) 0x35U,(a)
#define HID_PHYSICAL_MIN_16(a,b) 0x36U,(a),(b)
#define HID_PHYSICAL_MIN_32(a,b,c,d) 0x37U,(a),(b),(c),(d)#define HID_PHYSICAL_MAX_8(a) 0x45U,(a)
#define HID_PHYSICAL_MAX_16(a,b) 0x46U,(a),(b)
#define HID_PHYSICAL_MAX_32(a,b,c,d) 0x47U,(a),(b),(c),(d)#define HID_INPUT_8(a) 0x81U,(a)
#define HID_INPUT_16(a,b) 0x82U,(a),(b)
#define HID_INPUT_32(a,b,c,d) 0x83U,(a),(b),(c),(d)#define HID_OUTPUT_8(a) 0x91U,(a)
#define HID_OUTPUT_16(a,b) 0x92U,(a),(b)
#define HID_OUTPUT_32(a,b,c,d) 0x93U,(a),(b),(c),(d)#define HID_FEATURE_8(a) 0xB1U,(a)
#define HID_FEATURE_16(a,b) 0xB2U,(a),(b)
#define HID_FEATURE_32(a,b,c,d) 0xB3U,(a),(b),(c),(d)#define HID_END_COLLECTION 0xC0U
6. 总结
本篇主要讲了HID报文描述符,以及如何根据报文的格式编写报文描述符。这只是对HID报文描述符的入门,还有一些问题没有谈到。虽然这篇是入门篇,但至少看完这篇已经能自己编写描述符了,或者说已经能达到使用报文描述符的程度了。
下篇将继续深入报文描述符,讲一些本篇还没有讲到的一些点。
欢迎大家来评论与指正,你的点赞与评论将有助于作者改善文章质量,并继续前行
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- web概述
Web概念概述JavaWeb软件架构C/S:Client/Server 客户端/服务器端B/S:Browser/Server 浏览器/服务器资源分类静态资源动态资源:JavaWeb 使用java语言开发基于互联网的项目 软件架构 C/S:Client/Server 客户端/服务器端 在用户本…...
2024/5/2 22:37:43 - go 发送邮件 (支持发送多人、多文件)
背景:job执行作业需要同步一些数据,每天需要拉取最新的数据,并发送给负责人 1 自动生成文件 .txt .xls (不用管) 2 写一个能发邮件的接口 3 能做到发送给多个用户 4 能够支持发送多个文件 我用的是网易邮箱 前提:需要…...
2024/5/2 22:37:39 - html学习5
表单的初步认识 表单form <!doctype html> <html><head><title>表单的初步认识</title></head><body><!--form为表单,action的值为服务器的地址格式:action?namevalue&namevalue&namevalue&…...
2024/5/2 22:37:35 - 某高校计算机编程教授教你如何快速入门python,一文带你进入编程
如何快速入门Python 学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层。虽然万事开头难,但好的开始是成功的一半,今天这…...
2024/5/2 15:39:17 - 攻防世界,Misc:this_is_flag
根据题目提示 得到flag...
2024/5/2 19:29:32 - python log日志
#!usr/bin/env python # -*- coding:utf-8 _*- 日志功能:1、返回logger2、日志级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG3、避免重复打印日志,要及时清理句柄:# 每次被调用前,清空已经存在handler# self.logger.han…...
2024/5/2 22:37:28 - 如果只考虑有序树的情形,那么具有7个结点的不同形态的树共有(132)棵。
如果只考虑有序树的情形,那么具有7个结点的不同形态的树共有()棵。 A 132 B 154 C 429 D 均不正确 答案:A 解析过程: 结论一:具有n个结点有不同形态的树的数目和具有n-1个结点互不相似的二叉树的数目相同 分…...
2024/5/2 22:37:24 - go 发送邮件 (发送多人,多文件)
背景:job执行作业需要同步一些数据,每天需要拉取最新的数据,并发送给负责人 1 自动生成文件 .txt .xls (不用管) 2 写一个能发邮件的接口 3 能做到发送给多个用户 4 能够支持发送多个文件 我用的是网易邮箱 前提:需要…...
2024/5/2 22:37:20 - PCIE——地址空间访问机制
一、 PCI地址空间划分 1.1 CPU域和PCI总线域 PCI spec规定了PCI设备必须提供的单独地址空间,因此PCIe设备的地址空间和SoC(CPU)域的地址空间是分开的,根据王齐老师的**《PCI Express体系结构导读》**一书,存储器域包…...
2024/5/2 22:37:15 - SkyWalking中是如何统计方法调用时间的
1 前言 SkyWalKing中对每个方法和调用时间都进行了统计。那么他是如何实现的呢? 其实他是用了ByteBuddy和Java agent技术来统计方法的调用时长。 1.1 javaagent我在上一篇博客中已经提到过链接地址: https://blog.csdn.net/qq_50652600/articl…...
2024/5/2 22:37:11 - 2021-10-30 MarkDown学习
MarkDown学习 标题 字体 Hello world Hello world Hello world Hello world 引用 选择虾爆之怒 团战分割你和我 分割线 #### 图片 超链接 点击跳转到csgo官网 列表 a c a b c 表格 武器品质耐久太刀极品60阔刀优品50长枪良品40 代码 system.out.println("…...
2024/5/2 22:37:08 - pg逻辑复制和数据同步
本文主要讲如何通过pg的逻辑复制功能,利用kafka,同步数据到第三方数据库(比如elassticsearch)。 pg逻辑复制 关于pg逻辑复制需要先看以下文章:《PostgreSQL变更事件捕获 》《pg的时间线解析》 逻辑复制几个比较重要…...
2024/5/2 10:42:35 - 【填坑之旅-hadoop-03】hadoop2.10.1 wordcount(Mapper,Reducer,Job,ToolRunner,Tool,InputFormat,OutputFormat)
注意 eclipse 最后在有hadoop的centos的机器上直接跑,不然问题会比较多 或者打成jar包,通过 hadoop jar XXX.jar cn.itcast.hadoop.mr.wordcount.WCRunner 在yarn上跑 job运行流程 input->split->map->buffer->partition->merge->s…...
2024/5/2 18:07:19 - 不锈钢304、316、316L、304L、321、303、410、430的化学成分
不锈钢304、316、316L、304L、321、303、410、430的化学成分 不锈钢化学成分表 下表列出了各种不锈钢的化学成分图,包括奥氏体如SS 304、304L 316、316L、321、303、302、301、904L、201等,马氏体SS如440A、440C、440B 420等,铁素体SS 430&…...
2024/5/2 15:33:52 - 孤尽31天-day02
前言 第二天:数据库 一、建表规约 解决数据库相关名称的纠结选择合适的数据类型和长度 1、建表强制规约 1.1 表、字段命名: • 必须使用小写字母或数字 • 禁止出现数字开头 • 禁止两个下划线中间只出现数字 • 不使用复数名词 • 禁用保留字 • 是与…...
2024/5/2 9:36:11 - zzulioj:1064:加密字符:这题学好了很有意思
1064: 加密字符 时间限制: 1 Sec 内存限制: 128 MB 题目描述 从键盘输入一批字符,以结束,按要求加密并输出。 输入 从键盘输入一批字符,占一行,以结束。 输出 输出占一行 加密规则: 1)所有字母均转换为小写。 …...
2024/5/2 22:36:47 - Java数组的排序查找
Java数组的排序查找 public class demo3 {public static void main(String[] args) {int[] anew int[]{9,8,7,6,5,4,3,2,1};//查找//线性查找int target5;for(int i0;i<a.length;i){if(a[i]target){System.out.print("找到了,目标位置为:"…...
2024/5/2 9:58:13 - excel 官方公式函数讲解大全
官方链接:https://support.microsoft.com/zh-cn/office/%E5%85%AC%E5%BC%8F%E5%92%8C%E5%87%BD%E6%95%B0-294d9486-b332-48ed-b489-abe7d0f9eda9#ID0EBBDFormulas 公式 函数 逻辑 引用 更多函数 错误...
2024/5/2 17:38:06 - console.log()函数的使用和浏览器console的调出
代码如下: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"width…...
2024/5/2 22:36:35 - Java集合相关知识
JAVA集合 Java集合框架概述: 集合与数组 集合与数组储存数据概述 集合、数组都是对多个数据进行存储操作的结构,简称Java容器 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt .jpg .avi 数据库…...
2024/5/6 16:03:01
最新文章
- [oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位
键盘改造 🥋 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…...
2024/5/8 13:54:40 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - 【Linux网络编程】网络编程套接字(TCP服务器)
【Linux网络编程】网络编程套接字(TCP服务器) 目录 【Linux网络编程】网络编程套接字(TCP服务器)地址转换函数关于inet_ntoa 简单的TCP网络程序TCP sockot API详解socket()bind()listen()accept();connect 完整的TCP服务器代码(线程池版) 作者࿱…...
2024/5/6 22:31:36 - JRT高效率开发
得益于前期的基础投入,借助代码生成的加持,本来计划用一周实现质控物维护界面,实际用来四小时左右完成质控物维护主体,效率大大超过预期。 JRT从设计之初就是为了证明Spring打包模式不适合软件服务模式,觉得Spring打包…...
2024/5/7 4:57:38 - 游戏引擎架构01__引擎架构图
根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ...
2024/5/6 18:32:42 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/7 14:25:14 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57