技术琦的家 - TechQI
type: channel
link: https://www.techqi.top/author/1/
description: TechQI
items: 嵌入式C语言中常用类型前缀
items: 关于SDCC下XRAM变量初始值可能不正确的问题
items: 基于KMS服务器激活Windows系统
items: KEA-DHCPv4以MySQL为后端的配置
items: 入侵防御snort3编译安装
items: USB键盘鼠标默认数据包结构
items: 色彩和色彩(图像)相关算法
items: 新JVM语言Kotlin的快速入门
items: 什么是OID(全局对象标识符)
items: 什么是IP地址以及它的分类

嵌入式C语言中常用类型前缀
type: item
date: 2025-06-17T06:49:56+00:00
description: 数据类型前缀uint8_tucint8_tcuint16_tuiint16_tiuint32_tulint32_tl普通指针p函数指针fn

关于SDCC下XRAM变量初始值可能不正确的问题
type: item
date: 2025-05-28T05:53:00+00:00
description: __xdata volatile int var0; __xdata volatile int var1 = 1; void main(void) { // 功能代码 }以上这个简单到发指的程序，在STC8A8K64U中遇到个奇怪问题：var0的初始值有时候不是0，而var1的初始值也不是1，是一些奇怪的随机值。第一感觉就是XRAM的初始化可能存在BUG，于是稍微了解了一下SDCC中XRAM初始化的原理，没想到还真发现了一些好玩的东西，给大家做个分享。一些前置知识。无论是Keil还是SDCC，在真正执行main函数之前，会自动插入一些初始化代码，这里面就包括RAM、IRAM和XRAM的初始化等。在从C编译成汇编的过程中，编译器会按照功能和特性的不同，会生成很多辅助的段或者叫做小节。与本问题相关的小节主要有：;-------------------------------------------------------- ; uninitialized external ram data ;-------------------------------------------------------- .area XSEG (XDATA) _var0:: .ds 2 ;-------------------------------------------------------- ; initialized external ram data ;-------------------------------------------------------- .area XISEG (XDATA) _var1:: .ds 2 ;-------------------------------------------------------- ; external ram initial data ;-------------------------------------------------------- .area XINIT (CODE) __xinit__var1: .byte #0x01, #0x00;未初始化外部变量存储区XSEG，var0就属于这个区，因为它定义在外部扩展RAM中(__xdata)，且代码中没有给它赋初始值；已初始化外部变量存储区XISEG，var1就属于这个区，因为它定义在外部扩展RAM中(__xdata)，且代码中有给它赋初始值；已初始化外部变量初始值区XINIT，注意这个实际上是在代码区里面，是ROM不是RAM，最终会烧录在flash的特定位置。另外，在编译过程中会生成一些辅助变量，s_是特定区的起始位置，l_是特定区的长度。如s_XSEG就是XSEG区的起始位置。按照C语言规范，未初始化的全局变量(如var0)应当默认给初始值0，这个SDCC帮我们做了，代码在crtxclear.asm中 .globl __XPAGE __mcs51_genXRAMCLEAR:: mov r0,#l_PSEG mov a,r0 orl a,#(l_PSEG >> 8) jz 00006$ mov r1,#s_PSEG mov __XPAGE,#(s_PSEG >> 8) clr a 00005$: movx @r1,a inc r1 djnz r0,00005$ 00006$: mov r0,#l_XSEG mov a,r0 orl a,#(l_XSEG >> 8) jz 00008$ mov r1,#((l_XSEG + 255) >> 8) mov dptr,#s_XSEG clr a 00007$: movx @dptr,a inc dptr djnz r0,00007$ djnz r1,00007$ 00008$:已初始化的全局变量(如var1)，也需要执行一些操作才能有初始值，这个SDCC帮我们做了，代码在crtxinit.asm中 .globl __XPAGE __mcs51_genXINIT:: mov r1,#l_XINIT mov a,r1 orl a,#(l_XINIT >> 8) jz 00003$ mov r2,#((l_XINIT+255) >> 8) mov dptr,#s_XINIT mov r0,#s_XISEG mov __XPAGE,#(s_XISEG >> 8) 00001$: clr a movc a,@a+dptr movx @r0,a inc dptr inc r0 cjne r0,#0,00002$ inc __XPAGE 00002$: djnz r1,00001$ djnz r2,00001$ mov __XPAGE,#0xFF 00003$:其实这里就已经能发…

基于KMS服务器激活Windows系统
type: item
date: 2024-12-30T10:57:21+00:00
description: 执行激活脚本slmbr.vbs /xpr slmgr.vbs /upk slmgr.vgs /ipk {GVLK} slmgr.vbs /skms {ADDR} slmgr.vbs /ato说明：将脚本中的{GVLK}按系统版本替换成KMS密钥将脚本中的{ADDR}替换成KMS服务器地址通用批量许可证密钥 (GVLK)在下表中，可找到 Windows 每个版本的 GVLK。 LTSC 是长期服务渠道，而 LTSB 是 Long-Term Servicing Branch 。Windows Server（LTSC 版本）Windows Server 2022操作系统版本KMS 客户端产品密钥Windows Server 2022 DatacenterWX4NM-KYWYW-QJJR4-XV3QB-6VM33Windows Server 2022 Datacenter Azure EditionNTBV8-9K7Q8-V27C6-M2BTV-KHMXVWindows Server 2022 StandardVDYBN-27WPP-V4HQT-9VMD4-VMK7HWindows Server 2019操作系统版本KMS 客户端产品密钥Windows Server 2019 DatacenterWMDGN-G9PQG-XVVXX-R3X43-63DFGWindows Server 2019 StandardN69G4-B89J2-4G8F4-WWYCC-J464CWindows Server 2019 EssentialsWVDHN-86M7X-466P6-VHXV7-YY726Windows Server 2016操作系统版本KMS 客户端产品密钥Windows Server 2016 DatacenterCB7KF-BWN84-R7R2Y-793K2-8XDDGWindows Server 2016 StandardWC2BQ-8NRM3-FDDYY-2BFGV-KHKQYWindows Server 2016 EssentialsJCKRF-N37P4-C2D82-9YXRT-4M63BWindows 11 和 Windows 10（半年频道版本）有关受支持的版本和服务终止日期的信息，请参阅 Windows 生命周期情况说明书。操作系统版本KMS 客户端产品密钥Windows 11 专业版 Windows 10 专业版W269N-WFGWX-YVC9B-4J6C9-T83GXWindows 11 专业版 N Windows 10 专业版 NMH37W-N47XK-V7XM9-C7227-GCQG9Windows 11 专业工作站版 Windows 10 专业工作站版NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84JWindows 11 专业工作站版 N Windows 10 专业工作站版 N9FNHH-K3HBT-3W4TD-6383H-6XYWFWindows 11 专业教育版 Windows 10 专业教育版6TP4R-GNPTD-KYYHQ-7B7DP-J447YWindows 11 专业教育版 N Windows 10 专业教育版 NYVWGF-BXNMC-HTQYQ-CPQ99-66QFCWindows 11 教育版 Windows 10 教育版NW6C2-QMPVW-D7KKK-3GKT6-VCFB2Windows 11 教育版 N Windows 10 教育版 N2WH4N-8QGBV-H22JP-CT43Q-MDWWJWindows 11 企业版 Windows 10 企业版NPPR9-FWDCX-D2C8J-H872K-2YT43Windows 11 企业版 N Windows 10 企业版 NDPH2V-TTNVB-4X9Q3-TJR4H-KHJW4Windows 11 企业版 G Windows 10 企业版 GYYVX9-NTFWV-6MDM3-9PT4T-4M68BWindows 11 企业版 G N Windows 10 企业版 G N44RPN-FTY23-9VTTB-MP9BX-T84FVWindows 10（LTSC/LTSB 版本）Windows 10 LTSC 2021 和 2019操作系统版本KMS 客户端产品密钥Windows 10 企业版 LTSC 2021 Windows 10 企业版 LTSC 2019M7XTQ-FN8P6-TTKYV-9D4CC-J462DWindows 10 企业版 N LTSC 2021 Windows 10 企业版 N LTSC 201992NFX-8DJQP-P6BBQ-THF9C-7CG2HWindows 10 LTSB 2016操作系统版本…

KEA-DHCPv4以MySQL为后端的配置
type: item
date: 2023-01-30T11:06:31+00:00
description: { "Dhcp4": { "server-tag": "DHCPv4-A", "interfaces-config": { "interfaces": [ "enpXsY" ], "dhcp-socket-type": "raw" }, "control-socket": { "socket-type": "unix", "socket-name": "/tmp/kea-dhcp4-ctrl.sock" }, "hooks-libraries": [ { "library": "/usr/lib64/kea/hooks/libdhcp_mysql_cb.so" } ], "config-control": { "config-databases": [ { "type": "mysql", "name": "kea", "user": "kea", "password": "******", "host": "host", "port": 3306 } ], "config-fetch-wait-time": 20 }, "lease-database": { "type": "mysql", "name": "kea", "user": "kea", "password": "******", "host": "host", "port": 3306 }, "hosts-database": { "type": "mysql", "name": "kea", "user": "kea", "password": "******", "host": "host", "port": 3306 }, "loggers": [ { "name": "kea-dhcp4", "output_options": [ { "output": "/var/log/kea/dhcp4.log" } ], "severity": "INFO", "debuglevel": 0 } ] } }

入侵防御snort3编译安装
type: item
date: 2022-12-26T11:33:00+00:00
description: dnf install epel-release dnf config-manager --set-enabled crb dnf install cmake automake autoconf g++ libtool flex dnf install openssl-devel libdnet-devel hwloc-devel luajit-devel libpcap-devel pcre-devel xz-devel zlib-devel git clone https://github.com/snort3/libdaq.git ./bootstrap ./configure make install ldconfig git clone https://github.com/snort3/snort3.git ./configure_cmake.sh cd build make -j $(nproc) make install

USB键盘鼠标默认数据包结构
type: item
date: 2022-03-29T11:46:27+00:00
description: 抛开USB协议本身的结构数据之外，通用USB键盘鼠标的数据包相当简单。USB键盘每次发送八个字节，而USB数据每次发送四个字节。USB键盘数据包BYTE0 ├─ bit0： Left Control是否按下，按下为1 ├─ bit1： Left Shift 是否按下，按下为1 ├─ bit2： Left Alt 是否按下，按下为1 ├─ bit3： Left Win 是否按下，按下为1 ├─ bit4： Right Control是否按下，按下为1 ├─ bit5： Right Shift 是否按下，按下为1 ├─ bit6： Right Alt 是否按下，按下为1 └─ bit7： Right Win 是否按下，按下为1 BYTE1 ─ 保留位 BYTE2 ~ BYTE7 ─ 这六个为普通按键键码USB鼠标数据报BYTE0 ├─ bit7: 表示Y坐标的变化量超出-256~255的范围，0表示没有溢出 ├─ bit6: 表示X坐标的变化量超出-256~255的范围，0表示没有溢出 ├─ bit5: Y坐标变化的符号位，1表示负数，即鼠标向下移动 ├─ bit4: X坐标变化的符号位，1表示负数，即鼠标向左移动 ├─ bit3: 恒为1 ├─ bit2: 1表示中键按下 ├─ bit1: 1表示右键按下 └─ bit0: 1表示左键按下 BYTE2 ─ X坐标变化量，与byte的bit4组成9位符号数，负数表示向左移，正数表右移。用补码表示变化量 BYTE3 ─ Y坐标变化量，与byte的bit5组成9位符号数，负数表示向下移，正数表上移。用补码表示变化量 BYTE4 ─ 滚轮变化。

色彩和色彩(图像)相关算法
type: item
date: 2022-03-07T07:14:00+00:00
description: 颜色是通过眼、脑和我们的生活经验所产生的一种对光的视觉效应，我们肉眼所见到的光线，是由频率范围很窄的电磁波产生的，不同频率的电磁波表现为不同的颜色，对色彩的辨认是肉眼受到电磁波辐射能刺激后所引起的一种视觉神经的感觉。但色彩在电脑里面是如何表示的呢？围绕色彩又有哪些常用的算法呢？请看下文：颜色表示方法LMS色彩人类眼睛有对于长(L, 560-580nm)、中(M, 530-540nm)、短(S, 420-440nm)波长的光感受器(视锥细胞)，因此根据三种视锥细胞的刺激比例，便能描述任一种颜色的感觉，此称为LMS空间需要注意的是，人类还有一种单色的夜视光感测器(视杆细胞)，其最敏感的感知频谱范围约在490-495nm，约在绿色范围内CIE色彩CIE(International Commission on Illumination, 法文Commission internationale de l'éclairage)基于生理、物理实验等的颜色模型，理论上包括了所有人眼可见光，包括有CIE-RGB、CIE-LAB、CIE-XYZ、CIE-xyY等多种模型，更偏向于色彩理论研究一些。大写的Y通常都表示感观亮度YUV/YCrCb色彩YUV主要用于模拟电视信号，YCrCb主要用于数字视频信号。但大致含义基本是相同的，Y表示明度信息，UVCrCb都是用于描述色度信息，mpeg、jpeg仍然在使用这种色彩表示方式。当初这么设计的原因有两点：人眼对亮度变化更加敏感一些，每一个亮度信息Y都应该单独保存；而人眼对色度变化不那么敏感，相邻的2个或4个像素点可以共用色度信息，可以减少数据大小。可以方便兼容黑白电视，只需要取出Y信号就可以了。换算规则：$$ \begin{aligned} Y &=& 0.299R + 0.587G + 0.114B \\ U &=& -0.147R - 0.289G + 0.436B \\ V &=& 0.615R - 0.515G - 0.100B \end{aligned} $$RGB色彩(Red、Green、Blue)一个物体如果自身发光的话，它发出什么颜色我们就看到什么颜色。如果是多个色光同时发光，我们看到的是所有色光叠加后的颜色。使用加法三原色的组合来表示一个点的具体色彩其中每一个三原色通道的取值范围是[0, 255]理论上可以表示$255\times255\times255=2^{8+8+8}=16777216$种颜色LinearRGB理论上完全按照物理规律的RGB表示法，通常使用[0, 1]范围内的值来表示sRGB由于人眼特性，人对暗色变化更加敏感，因此肉眼感觉的50度灰实际线性值只有0.214左右。为了使计算机表示色彩递进关系和人眼感受到的基本一致，微软联合爱普生、HP等制定了sRGB，它的通道值127就对应人眼感受到的中灰（传说中的伽玛校正）。++通常情况下如果没有特殊说明，一般所说的“RGB”均指sRGB++AdobeRGB比sRGB全，包含了所有CMYK色彩CMYK色彩(Cyan、Magenta、Yellow、Black)一个物体如果自身不发光的话，我们看到的颜色是它吸收后剩余的颜色。显然它的三原色就是发光三原色的互补色（为什么防蓝光眼镜看起来偏黄）使用减法三原色的组合来表示一人点的具体色彩通常CMYK每一个色彩通道的取值范围是[0, 100]理论上可以表示$100\times100\times100=1000000$种颜色换算规则：$$ \left\{ \begin{aligned} C^{'} &=& \frac{255-R}{255} \\ M^{'} &=& \frac{255-G}{255} \\ Y^{'} &=& \frac{255-B}{255} \end{aligned} \right. $$$$ K = \min(C^{'}, M^{'}, Y^{'}) $$$$ \left\{ \begin{aligned} C &=& C^{'} - K \\ M &=& M^{'} - K \\ Y &=& Y^{'} - K \end{aligned} \right. $$HS?色彩色相(Hue): 决定是什么颜色色系，一般情况下H取值范围是[0, 360)$$ \left\{ \begin{aligned} R{'} &=& R \times \frac{1}{255} \\ G{'} &=& G \times \frac{1}{255} \\ B{'} &=& B \times \frac{1}{255} \end{aligned} \right. $$$$ \left\{ \begin{aligned} C_{max} &=& \max(R{'}, G{'}, B{'}) \\ …

新JVM语言Kotlin的快速入门
type: item
date: 2022-03-07T04:51:00+00:00
description: Kotlin作为一种JVM语言，与传统的Java相比，增加了很多有意思的语法糖，可以显著降低开发难度，提升开发效率，增加代码健壮性。基础篇变量和类型Kotlin中定义变量使用如下结构定义常量/变量val 常量名: 类型 = 常量值 var 变量名: 类型 = 初始值空安全Java中最常见的一个问题就是NullPointException，在Kotlin中为了减少此问题推出了optional语法。在定义一个变量时，若在常规类型后加一个?，表示此变量可以为null。/** str1不能为null */ var str1: String = "" /** str2可以为null */ var str2: String? = null在调用可空对象的方法时，需要加一个?以进行安全的调用。/** str1一定不为null，因此直接访问它的属性就是安全的 */ val len1 = str1.length /** str2可能为null，必须加?以安全访问它的属性，当str2为null时，len2也为null */ val len2 = str2?.length如果一个对象定义为可空，但在使用时确信一定不为null，则可以使用!!进行强转，但强烈建议不要这么做// 当str2为null时会抛NPE val len2 = str2!!.length结合?:操作符，可以省掉很多null判断（A ?: B的含义为，只有当A为null时才会执行B）例一fun joinRoom(roomId: Long?, password: String?): Boolean { roomId ?: return false password ?: return false …… }例二public String recordingFaceUrl() { if (mediaBean != null) { if (mediaBean.recording != null) { if (mediaBean.recording.face_cover_url != null) { return mediaBean.recording.face_cover_url; } else { return mediaBean.recording.cover_image; } } else { return ""; } } else { return ""; } }fun recordingFaceUrl(): String { return mediaBean?.recording?.face_cover_url ?: mediaBean?.recording?.cover_image ?: "" }类型推导当定义变量时初始值类型明确时，可以省略类型声明，Kotlin会自动推导出来。// 自动推导出str1的类型为String var str1 = "abcde" // 会自动推导出len的类型为Int var len = "ABDEF".length当已经经过了类型检测时，可以直接当作检测后的类型使用，而无需强转。void forbar(Object obj) { if (obj instanceof String) { ((String) obj).chatAt(0); } }fun forbar(any: Any) { if (any is String) { // obj已经被自动转成了String类型 obj.chatAt(0) } } fun forbar(any: Any) { if (any !is String) return // obj已经被自动转成了String类型 obj.chatAt(0) }在泛型相关调用中，多数泛型参数也能够被自动推导填充（注：目前Java8也支持大部分泛型的类型推导）与Java进行互调时，自动推导出的类型不是空安全的，并且会失去空安全检测。// 自动推导出str1类型是 String! ，即不是 String 也不是 String? val str1 = context.getString(R.string.title) // 编译不会报错并可运行，但有NPE风险 var len1 = str1.length // 编译不会报错并可运行，但有NPE风险 val str2: String = context.getString(R.string.title)解决办法：在Java的方法中使用@Nullable和@NotNull注解明确返回值是否可空特殊类型Kotlin中数字类型处理方式与Java很不同，表面上全部都是封装的类类型，但实际可能根据上下文章自动装箱或拆箱。\例外情况是可空类型一定对应封装类型，如Kotlin的Int?一定对应…

什么是OID(全局对象标识符)
type: item
date: 2022-03-07T04:43:00+00:00
description: OID对象标识符Object Identifier就是通信中对“对象”的唯一编号。OID广泛使用于SNMP、PKI、LDAP等系统中。按照ISO/IEC9834-1(GB/T17969.1)标准的定义，“对象”是指“通信和信息处理世界中的任何事物，它是可标识(可以命名)的，同时它可被注册”。OID是与对象相关联的用来无歧义地标识对象的全局唯一的值，可保证对象在通信权威信息处理中正确地定位和管理。组织形式与域名结构层级关系类似，OID编码也是一种树状结构，并且没有层级数量的限制。OID名称包括数字和字符串两种形式：数字名称形式下，每个层次的值是一个大于0小于16000000的正整数，不同层次之间用点号“.”分隔；字符串名称形式下，每个层次的值是一个不少于1个字符并且不大于100个字符的可变长度字符串，同时该值在注册机构范围内是唯一的，不同层次之间用点号“/”分隔。每一个OID必须具有数字名称，而字符串名称则是可有可无的。同样与域名的管理方式类似，国家(地区)级OID由各国(地区)相应机构自行管理，例如我国就自行管理了1.2.156和2.16.156分支等，其余OID则由互联网数字分配机构(IANA)统一管理，若国家(地区)不具备管理的能力则也由IANA代管。若有注册新OID的需求，可以访问[http://www.china-oid.org.cn/]()以了解更多信息。示例说明由于OID包含条目众多，并且随时都有可能新增，因此若想获得最新信息可以查阅[http://oid-info.com]()。以下只摘录了极小一部分作演示用：. OID ├─ 0 (ITU-T) ├─ 1 (ISO) │ ├─ 0 (ISO and IEC standard) │ ├─ 1 (Registration Authorities) │ ├─ 2 (Member-Body) │ │ ├─ 156 (cn, China) │ │ │ ├─ 1 (cesi, China Electronics Standardization Institute) │ │ │ └─ 2 (cn-ora, China "OID Registration Authority") │ │ └─ 344 (hk, Hong Kong) │ │ └─ 840 (us, United States) │ └─ 3 (Identified-Organization) │ └─ 6 (dod, Department of Defense) │ └─ 1(internet) │ ├─ 2 (mgmt, Management) │ │ └─ 1 (mib-2, Management Information Bases Version 2) │ │ ├─ 1 (system) │ │ │ ├─ 1 (sysDescr) │ │ │ └─ 3 (sysUpTime) │ │ │ └─ 0 (sysUpTimeInstance) │ │ └─ 2 (pib, Policy Information Base) │ └─ 4 (private, Private projects) │ └─ 1 (enterprise) │ └─ 1466 (LDAPv3 OIDs) │ └─ 115 (syntax definitions of LDAPv3 schema framework) │ └─ 121 (attribute syntax definitions of LDAPv3) │ └─ 1 (attribute type syntax definitions of LDAPv3) │ ├─ 7 (boolean) │ └─ 12 (utf-8 string) └─ 2(joint-ISO-ITU-T) └─ 5(ds, Directory Services) ├─ 4(attributeType) │ ├─ 0(objectClass) │ └─ 4(commonName) └─ 29(certificateExtension) └─ 17(subjectAltName)查询以上OID树可以得到如下定义：OID(数字名)OID(字符串名)含义1.2.156.1ISO/Member-Body/CN/1中国电子技术标准化研究所1.2.156.2ISO/Member-Body/CN/2中国OID注册中心1.3.6.1.2.1.1.1ISO/Identified-Organization/6/1/2/1/1/1SNMP系统基本信息1.3.6.1.2.1.1.3.0ISO/Identified-Organization/6/1/2/1/1/3/0SNMP系统开机时间1.3.6.1.4.1.1466.115.121…

什么是IP地址以及它的分类
type: item
date: 2022-03-07T04:33:00+00:00
description: IP地址Internet Protocol Address是指互联网协议地址，又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式，它为互联网上的每一个网络和每一台主机分配一个逻辑地址，以此来屏蔽物理地址的差异。IP地址就像是我们的家庭住址一样，如果你要写信给一个人，你就要知道他（她）的地址，这样邮递员才能把信送到。计算机发送信息就好比是邮递员，它必须知道唯一的“家庭地址”才能不至于把信送错人家。只不过我们的地址是用文字来表示的，计算机的地址用二进制数字表示。IPv4地址IPv4地址由四个字节即32位组成，但实际中一般书写成点分十进制格式，即一个字节为一组，每组有效范围0~255，组间用.号进行连接。一般情况下IPv4地址首字节不能为0，即合法有效的最小IPv4地址是1.0.0.0。IPv4地址包含网络号和主机号两个部分，网络号表示其属于哪一个具体网络，主机号表示其属于该网络中的哪一台主机。在同一个硬件能够互联互通的网络环境下，网络号相同时一般可以认为属于同一个网络。子网掩码仅单纯给定一个IPv4地址时，是无法得知网络号或主机号的。如果要知道网络号或主机号，必须要结合子网掩码运算才行。子网掩码通常有两种常见表示方法：一是网络号在IP地址中所占的位数，例如192.161.147.73/12；二是将网络号所在位全部置为1，主机号所在位全部置为0，并转换点分十进制表示，例如192.161.147.73/255.240.0.0。二者含义完全一样，都表如下的网络号和主机号：$$ \begin{matrix} \underbrace{ 11000000.1010 } \\ 网络号 \end{matrix} \begin{matrix} \underbrace{ 0001.10010011.01001001 } \\ 主机号 \end{matrix} $$其网络号部分为11000000.1010(即192.160.0.0)，主机号部分为0001.10010011.01001001(即0.1.147.73)。注意： ①主机号全为0时有特殊用途，用于表示该网络的完整网络号，不能分配给主机使用。 ②主机号全为1时有特殊用途，用于表示该网络的广播地址，不能分配给主机使用。 ③网络号不能全为0，因为此时完整网络号将变成0.0.0.0，该地址有其它特殊用途。 地址分类地址类别地址范围二进制表示默认掩码A类1.0.0.0 到 127.255.255.2550xxxxxxxx . z . z . z255.0.0.0(8)B类128.0.0.0 到 191.255.255.25510xxxxxxx . z . z . z255.255.0.0(16)C类192.0.0.0 到 223.255.255.255110xxxxxx . z . z . z255.255.255.0(24)D类224.0.0.0 到 239.255.255.2551110xxxxx . z . z . z E类240.0.0.0 到 255.255.255.2551111xxxxx . z . z . z A类地址网络号部分为8位，最高位固定为0，所以网络号有效范围是1~127，每个网络可以有16777214个主机号(2^24^-2)。B类地址网络号部分为16位，最高两位固定为10，所以网络号有效范围是128~191，每个网络可以有65534个主机号(2^16^-2)。C类地址网络号部分为24位，最高三位固定为110，所以网络号有效范围是192~223，每个网络可以有254个主机号(2^8^-2)。D类地址最高四位固定为1110，此类地址不区分网络号和主机号，只在组播中使用。例如224.0.0.2表示所有路由的组播地址。E类地址最高四位固定为1111，此类地址不区分网络号和主机号，仅用于实验用途。此五类地址划分未将特殊IPv4地址/地址段去除，使用时要注意不要轻易使用这些特殊的地址/地址段。特殊地址0.0.0.0 此地址通常用于表示一个无效的、未知的或者不可用的目标； 在服务器上可用于表示本机上的所有IPv4地址，通常用于简化服务器拥有多个IPv4时的配置； 在路由中可用于表示默认路由，即当路由表中没有找到匹配的路由的时候所对应的路由。100.64.0.0/10 用于在电信级NAT环境中服务提供商与其用户通信。127.0.0.0/8 此段地址全部表示回环地址，所有发往该地址段的数据包都应当被送回。但在实际中除127.0.0.1外，发往本段内其它地址的数据可能会被丢弃。127.0.0.1/24 回环地址中的一个，其特殊之处在于，所有网络设备一定在此地址上遵循了“回环地址”的约定，即发往该地址的数据会被立即发回它自身。10.0.0.0/8 A类地址中的私有地址，只能出现在局域…