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

图文解析ASN.1中BER编码:结构类型、编码方法、编码实例

本文将详细介绍ASN.1中的BER编码规则,包括其编码机制、数据类型表示、以及如何将复杂的数据结构转换为二进制数据。通过本文的阅读,读者将对ASN.1中的BER编码有一个全面的理解。


目录

一.引言

二.BER编码基本结构

▐ 1. 类型域(Type)

示例一

示例二

▐ 2. 长度域(Length)

示例一

示例二

▐ 3. 内容域(Value)

布尔型(BOOLEAN)

整型(INTEGER)

位串(BIT STRING)

字符串(OCTET STRING)

NULL

对象标识符(OBJECT IDENTIFIER)

序列(SEQUENCE)


一.引言

在现代通信和信息技术领域,数据的精确表示和高效传输是至关重要的。ASN.1(Abstract Syntax Notation One)作为一种国际标准化组织(ISO)和国际电信联盟(ITU)制定的国际标准,提供了一种抽象的方法来描述、编码、解码和传输数据。ASN.1的核心组成部分之一是BER(Basic Encoding Rules),它定义了一种将ASN.1数据结构转换为二进制形式的编码规则。

BER编码不仅确保了数据的一致性和互操作性,而且通过其灵活的编码机制,支持了广泛的数据类型和结构。从简单的整数和字符串到复杂的数据结构,如序列和集合,BER编码都能够提供一种标准化的表示方法。这使得不同系统和应用程序能够无缝地交换数据,无论它们运行在何种平台或使用何种编程语言。


二.BER编码基本结构

BER(Basic Encoding Rules)是一种用于描述ASN.1(Abstract Syntax Notation One)数据的编码规则。BER编码广泛用于网络协议和数据交换标准,例如SNMP和LDAP。BER编码使用一种TLV(Type-Length-Value)的结构方法编码。

即,BER编码的基本结构由以下三个部分组成:

  • 类型域(Type)
  • 长度域(Length)
  • 内容域(Value)

其中类型(Type)部分又有三部分组成:

  • 标签类型(Class)
  • 构造类型(P/C)
  • 标签号(Tag)

 就拿C语言的数据结构来说,除了有单一的Int类型,Doubel类型等,还有复杂的自定义类型结构体,对于一种数据结构中包含了其他数据结构的情况,BER编码也对其进行了规定,称之为结构类型。结构类型与一般简单类型的不同如下图:

如图所示,在复杂的结构类型中,他的内容域往往包含了许多简单类型。毕竟结构类型也只是简单类型的复合,因此下午的讲解全部都通过简单类型进行讲解。

我们分别对三部分进行分析: 

▐ 1. 类型域(Type)

在 BER(Basic Encoding Rules)编码中,类型域(Type)用于标识数据的类型和类别。类型域编码包含三个部分:类(Class)、构造类型(PC, Primitive/Constructed)、和标签号(Tag Number)。下面详细说明这三个部分的编码:

类型域结构

类型域是一个字节(8 位)或多个字节(对于较大的标签号)。第一个字节的结构如下:

  • 第1-2位:类(Class)

    • 00:通用类(Universal)

    • 01:应用类(Application)

    • 10:上下文特定类(Context-specific)

    • 11:私有类(Private)

  • 第3位:构造类型(Constructed/Primitive)

    • 0:原始类型(Primitive)

    • 1:构造类型(Constructed)

  • 第4-8位:标签号(Tag Number)

    • 若标签号小于 31(即 0-30),则直接使用这些位表示标签号。

    • 若标签号大于等于 31,则这些位全为 1,并且标签号在后续字节中以一种特殊的方式编码。

笔者这里给出图示如下:

对于标签号,这里在解释一下: 

简单标签号(0-30)

对于标签号在 0 到 30 之间的情况,直接在类型域的第4-8位表示。例如:

  • 通用类(Universal)布尔类型(Boolean):0000 0001,即 0x01

  • 应用类(Application)整数类型(Integer):0100 0010,即 0x42

复杂标签号(>= 31)

对于标签号大于等于 31 的情况,第4-8位全为 1(即 0b11111),并且标签号以基于 7 位的块形式在后续字节中表示,每个字节的最高位为 1,表示后续有更多字节,最后一个字节的最高位为 0。例如:

  • 标签号 31:0b1111 1111 0011 1111,即 0x1F 0x1F

  • 标签号 128:0b1111 1111 1000 0001 0000 0000,即 0x1F 0x81 0x00

示例一

Tag number < 31
yesterdayINTEGER ::=127Class = UniversalP/C = Primitive(简单类型)Tag = 2(INTEGER)Length =1 byteContent =127

按照给出的信息,我们就可以得到如下结论:

类型域值为:00000010(0x02)
长度域值为:01
内容域值为:7F
BER编码为:00000010 0000000101111111(02 01 7F)

示例二

Tag number >= 31
OwnInt ::=[APPLICATION 33]IMPLICIT INTEGER 
HillTall Ownint ::= 110Class = ApplicationP/C = Primitive(简单类型)Tag = 33Length = 1Content = 110

按照给出的信息,我们就可以得到如下结论:

类型值为:01011111 00100001(5F21)
长度值为:1
内容值为:6E(110)
BER编码为:5F 21 01 6E

总结

  • 类型域的前两位表示类(Class),第三位表示构造类型(Primitive/Constructed),第四至第八位表示标签号(Tag Number)。

  • 对于标签号小于 31 的情况,直接使用第4-8位。

  • 对于标签号大于等于 31 的情况,使用多个字节表示,第一字节的第4-8位全为 1,后续字节以 7 位块形式表示标签号。

通过这种编码方式,BER 能够灵活地表示各种数据类型,并确保编码的准确性和可扩展性。

▐ 2. 长度域(Length)

在 BER(Basic Encoding Rules)编码中,长度域用于指示随后的值域(Value)的长度。长度域的编码有主要两种形式:短形式和长形式。下面是对这两种形式的详细说明:

短形式

短形式用于表示长度小于 128 字节(即 0 到 127)的情况。在这种形式中,长度域仅占一个字节。该字节的最高位(第八位)为 0,低七位表示长度的值。例如:

  • 若长度为 5,则长度域为 0000 0101(即 0x05)。

  • 若长度为 127,则长度域为 0111 1111(即 0x7F)。

长形式

长形式用于表示长度大于等于 128 字节的情况。在这种形式中,长度域的第一个字节的最高位(第八位)为 1,低七位表示后续长度字节的个数。例如:

  • 若长度为 128,则长度域为 1000 0001(表示后续有 1 个字节)加上 1000 0000(表示长度为 128),即 0x81 0x80

  • 若长度为 300,则长度域为 1000 0010(表示后续有 2 个字节)加上 0000 0001 0010 1100(即 300),即 0x82 0x01 0x2C

长度不确定

上述俩种情况适合用于长度确定的情况,当长度不确定的时候,长度字节最高位置1,该字节的低7位置0。紧随的字节为内容字节,最后以两个字节 0x00 和 0x00 作为结束标志

图示如下:

示例一

Length < 128
DayOfYear ::= [application 17]IMPLICIT INTEGER
Today DayOfYear ::=128Class = ApplicationP/C = PrimitiveTag = 17Length = 2Content =128

 按照给出的信息,我们就可以得到如下结论:

提示:这里的内容域首位为 1 所有前面要加一个字节的0,后文会讲这部分

类型值:01 0 10001
长度值:0000 0010
内容值:0x00 80
BER编码为:01010001 00000010 00000000 10000000

示例二

Length >= 128
MemoString ::= Octest String( size(256))
memo MemoString ::=“abc...Class = UniversalP/C = PrimitiveTag = 4Length = 256

按照给出的信息,我们就可以得到如下结论:

类型值:00 0 00100(04)
长度值:1000 0010(0x82) 0000 0001 0000 0000(0x0100)
内容值:61 62 63...(”abc...”)
BER编码为:04 82 01 00 61 62 63

总结

  • 对于长度小于 128 的值,使用短形式,只需要一个字节,最高位为 0。

  • 对于长度大于等于 128 的值,使用长形式,首字节的最高位为 1,低七位表示后续字节的数量,这些后续字节组成一个大端整数,表示长度值。

  • 如果长度不确定,长度字节最高位置1,该字节的低7位置0,最后以俩个字节 0x00 和 0x00 作为结束标志

这样,BER 编码能够灵活地表示不同长度的数据,确保编码的效率和可扩展性。

▐ 3. 内容域(Value)

在 BER(Basic Encoding Rules)编码中,内容域(Value)包含实际的数据信息,其编码方式取决于数据的类型。不同数据类型有不同的编码规则。以下是一些常见数据类型的编码方式:

布尔型(BOOLEAN)

布尔型值使用一个字节表示:

  • TRUE 编码为 0xFF

  • FALSE 编码为 0x00

整型(INTEGER)

整型值以大端顺序(高字节在前)编码,使用最少的字节数来表示值。如果最高有效位为 1,则需要在前面加一个 0x00 以避免符号扩展。例如:

  • 0 编码为 0x00

  • 127 编码为 0x7F

  • 128 编码为 0x00 0x80

  • -1 编码为 0xFF

位串(BIT STRING)

位串由一个初始字节和实际数据组成。初始字节表示未使用的位数。实际数据按字节顺序排列。例如:

  • 0x01101011(假设全用)编码为 0x00 0x6B

  • 0x01101010(未使用1位)编码为 0x01 0x6A

字符串(OCTET STRING)

字符串(八位字节串)按字节顺序直接编码。例如:

  • "Hello" 编码为 0x48 0x65 0x6C 0x6C 0x6F

NULL

NULL 值没有内容,其长度为 0。因此,NULL 值的编码只是标记和长度,值为空。例如:

  • NULL 编码为 0x05 0x00

对象标识符(OBJECT IDENTIFIER)

对象标识符使用变量长度编码。前两个节点由 (X * 40) + Y 公式表示,后续节点使用基于 7 位的块形式编码,最高位为 1 表示有后续字节。例如:

  • 1.2.840.113549 编码为 0x2A 0x86 0x48 0x86 F7 0x0D(1*40 + 2 = 42, 840 = 0x86 0x48, 113549 = 0x86 0xF7 0x0D)

序列(SEQUENCE)

序列包含一个或多个元素,每个元素按其类型编码,然后依次排列。例如,一个包含一个整数和一个字符串的序列:

  • 整数:42 编码为 0x02 0x01 0x2A

  • 字符串:"Hi" 编码为 0x04 0x02 0x48 0x69

整个序列编码为:0x30(标记) 0x07(长度) 0x02 0x01 0x2A(整数) 0x04 0x02 0x48 0x69(字符串)

总结

值域的编码方式根据数据类型的不同而不同,具体编码规则如下:

  • 布尔型:使用一个字节表示 TRUE 或 FALSE。

  • 整型:大端顺序,使用最少的字节数。

  • 位串:一个初始字节表示未使用的位数,后跟实际数据。

  • 八位字节串:直接按字节顺序编码。

  • NULL:无内容,长度为 0。

  • 对象标识符:使用变量长度编码,前两个节点压缩表示,后续节点基于 7 位块编码。

  • 序列:包含一个或多个元素,按其类型编码后依次排列。

通过这些编码规则,BER 能够灵活且高效地表示各种类型的数据。


以上便是BER编码的基础结构和编码方法,掌握了上述种种就可以构建基本的BER编码,而更加复杂的编码也只是多个简单的编码复合而成。研究BER编码对于以下应用场景也有着重要的作用:

  1. 网络协议:BER编码在网络协议中用于确保数据在不同系统和平台之间传输时的准确性和完整性。

  2. 安全协议:在安全领域,BER编码用于加密和解密过程中,确保数据的安全传输,如在SSL/TLS协议中。

  3. 数字证书:BER编码用于数字证书的编码,这是公钥基础设施(PKI)的关键组成部分,广泛应用于身份验证和数据加密。

  4. 数据库:在数据库系统中,BER编码用于存储和检索结构化数据,提高数据的组织和访问效率。

  5. 数据存储:BER编码在数据存储解决方案中用于优化数据的存储格式,减少存储空间的使用。

  6. 图像和视频传输:在多媒体领域,BER编码可以用于图像和视频数据的高效传输和存储。




 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

相关文章:

图文解析ASN.1中BER编码:结构类型、编码方法、编码实例

本文将详细介绍ASN.1中的BER编码规则&#xff0c;包括其编码机制、数据类型表示、以及如何将复杂的数据结构转换为二进制数据。通过本文的阅读&#xff0c;读者将对ASN.1中的BER编码有一个全面的理解。 目录 一.引言 二.BER编码基本结构 ▐ 1. 类型域&#xff08;Type&#…...

jQuery如何停止动画队列

在jQuery中&#xff0c;你可以使用.stop()方法来停止动画队列。.stop()方法有几个可选的参数&#xff0c;可以用来控制停止动画的方式。 以下是.stop()方法的基本用法和一些参数选项&#xff1a; 无参数&#xff1a;立即停止当前动画&#xff0c;并跳到最后的状态。后续的动画…...

vue3+electron搭建桌面软件

vue3electron开发桌面软件 最近有个小项目, 客户希望像打开 网易云音乐 那么简单的运行起来系统. 前端用 Vue 会比较快一些, 因此决定使用 electron 结合 Vue3 的方式来完成该项目. 然而, 在实施过程中发现没有完整的博客能够记录从创建到打包的流程, 摸索一番之后, 随即梳理…...

oracle常用经典SQL查询

oracle常用经典SQL查询(转贴) oracle常用经典SQL查询 常用SQL查询&#xff1a; 1、查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name d.tablespace_name grou…...

Android shell 常用 debug 命令

目录 1、查看版本2、am 命令3、pm 命令4、dumpsys 命令5、sed命令6、log定位查看APK进程号7、log定位使用场景 1、查看版本 1.1、Android串口终端执行 getprop ro.build.version.release #获取Android版本 uname -a #查看linux内核版本信息 uname -r #单独查看内核版本 1.2、…...

Unity3D Shader数据传递语法详解

在Unity3D中&#xff0c;Shader是用于渲染图形的一种程序&#xff0c;它定义了物体在屏幕上的外观。Shader通过接收输入数据&#xff08;如顶点位置、纹理坐标、光照信息等&#xff09;并计算像素颜色来工作。为了使得Shader能够正确运行并产生期望的视觉效果&#xff0c;我们需…...

计算机组成原理(五)

一、链式查询方式 接口的优先级固定不变 在链式查询的情况下&#xff0c;设备的优先级通常与其在链中的位置有关。具体来说&#xff0c;越靠近查询链的起始位置的设备通常具有较高的优先级&#xff0c;而越靠近链的末尾位置的设备优先级较低。 优点&#xff1a; 简单实现&am…...

后端项目实战--瑞吉外卖项目软件说明书

瑞吉外卖项目软件说明书 一、项目概述 瑞吉外卖项目是一个外卖服务平台&#xff0c;用户可以通过该平台浏览餐厅菜单、下单、支付以及追踪订单状态。产品原型就是一款产品成型之前的一个简单的框架&#xff0c;就是将页面的排版布局展现出来&#xff0c;使产品得初步构思有一…...

LeetCode | 27.移除元素

这道题的思路和26题一模一样&#xff0c;由于要在元素组中修改&#xff0c;我们可以设置一个index表示目前要修改原数组的第几位&#xff0c;由于遍历&#xff0c;访问原数组永远会在我们修改数组之前&#xff0c;所以不用担心数据丢失的问题&#xff0c;一次遍历数组&#xff…...

为什么要选择AWS?AWS的优势有哪些?

亚马逊云服务器&#xff08;Amazon Web Services&#xff0c;AWS&#xff09;是全球领先的云计算服务提供商之一&#xff0c;其提供的云服务器是在全球范围内可用的弹性计算服务。对于很多用户来说&#xff0c;他们可能会担心亚马逊云服务器是否会对服务器的使用进行限制。以下…...

【Intel CVPR 2024】通过图像扩散模型生成高质量360度场景,只需要一个语言模型

在当前人工智能取得突破性进展的时代&#xff0c;从单一输入图像生成全景场景仍是一项关键挑战。大多数现有方法都使用基于扩散的迭代或同步多视角内绘。然而&#xff0c;由于缺乏全局场景布局先验&#xff0c;导致输出结果存在重复对象&#xff08;如卧室中的多张床&#xff0…...

postman教程-21-Newman运行集合生成测试报告

上一小节我们Postman Newman的安装方法&#xff0c;本小节我们讲解一下Postman Newman的具体使用方法。 使用Newman运行集合 1、导出Postman集合&#xff1a; 在Postman中&#xff0c;选择你想要运行的集合&#xff0c;然后点击“导出”按钮&#xff0c;选择导出为“Collect…...

基于条件谱矩的时间序列分析(以轴承故障诊断为例,MATLAB)

谱矩方法可以对数据的表面形貌做较为细致的描述&#xff0e;它以随机过程为理论基础&#xff0c;用各阶谱矩及统计不变量等具体的参数表征表面的几何形态&#xff0c;算术平均顶点曲率是一种基于四阶谱矩的统计不变量。 鉴于此&#xff0c;采用条件谱矩方法对滚动轴承进行故障诊…...

ArcGIS Pro 3.0加载在线高德地图

1、打开ArcGIS Online官网&#xff0c;登录自己的账号&#xff0c;登录后效果如下图所示 官网地址&#xff1a;https://www.arcgis.com/home/webmap/viewer.html 2、点击Add&#xff0c;选择Add Layer from Web&#xff0c;如下图所示 3、在显示的Add Layer from Web页面内&am…...

服务器防漏扫,主机加固方案来解决

什么是漏扫&#xff1f; 漏扫是漏洞扫描的简称。漏洞扫描是一种安全测试方法&#xff0c;用于发现计算机系统、网络或应用程序中的潜在漏洞和安全弱点。通过使用自动化工具或软件&#xff0c;漏洞扫描可以检测系统中存在的已知漏洞&#xff0c;并提供相关的报告和建议&#xf…...

Linux2(基本命令2)

目录 一、文件类型分类 二、基本命令 1. find 帮助查询 2. stat 查看文件的信息 3. wc 统计文本 4. 查看文本内容 4.1 cat 4.2 more 4.3 less 4.4 head 4.5 tail 5. cal 显示日历 6. date 显示时间 7. du 文件大小 8. ln 链接 软链接 硬链接 区别 9. history…...

拼团+秒杀+优惠折扣+个人免签双端商城源码

源码说明 可用拼团秒杀优惠折扣个人免签双端商城源码&#xff0c;全功能完美双端&#xff0c;对接个人免签支付。 这款商城源码非常完整&#xff0c;整体也非常简洁&#xff0c;功能全面&#xff0c;没有那么多冗杂的多余页面和无用代码&#xff0c;拿到后优化了下整体代码&a…...

【数据结构】双向链表(C语言)

哈喽铁子们&#xff0c;这里是博主鳄鱼皮坡。这篇文章将分享交流双向链表的相关知识&#xff0c;下面正式开始。 1. 双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严 谨&#xff0c;但是为了老…...

【TensorFlow深度学习】WGAN与DCGAN在图像生成中的应用实例

WGAN与DCGAN在图像生成中的应用实例 WGAN与DCGAN在图像生成中的应用实例&#xff1a;一场深度学习的视觉盛宴DCGAN简介WGAN简介应用实例&#xff1a;基于DCGAN的图像生成应用实例&#xff1a;WGAN的图像生成实践结语 WGAN与DCGAN在图像生成中的应用实例&#xff1a;一场深度学习…...

垫付商贩任务补单平台补单系统网站源码提供

垫付商贩任务补单平台补单系统网站源码提供...

vue富文本wangeditor加@人功能(vue2 vue3都可以)

依赖 "wangeditor/editor": "^5.1.23", "wangeditor/editor-for-vue": "^5.1.12", "wangeditor/plugin-mention": "^1.0.0",RichEditor.vue <template><div style"border: 1px solid #ccc; posit…...

######## redis各章节终篇索引(更新中) ############

其他 父子关系&#xff08;ctx、协程&#xff09;#### golang存在的父子关系 ####_子goroutine panic会导致父goroutine挂掉吗-CSDN博客 参数传递&#xff08;slice、map&#xff09;#### go中参数传递&#xff08;涉及&#xff1a;切片slice、map、channel等&#xff09; ###…...

一个基于MySQL的数据库课程设计的基本框架

数据库课程设计&#xff08;MySQL&#xff09;通常涉及多个步骤&#xff0c;以确保数据库的有效设计、实现和维护。以下是一个基于MySQL的数据库课程设计的基本框架&#xff0c;结合参考文章中的相关信息进行整理&#xff1a; ### 一、引言 * **背景**&#xff1a;简要介绍为…...

架构设计基本原则

开闭原则 开闭原则&#xff08;Open Closed Principle&#xff0c;OCP&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一个核心原则&#xff0c;主要强调的是软件实体&#xff08;类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改封闭。 解释&…...

云原生应用开发培训,开启云计算时代的新征程

在云计算时代&#xff0c;云原生应用开发技术已经成为IT领域的热门话题。如果您想要转型至云原生领域&#xff0c;我们的云原生应用开发培训将帮助您开启新征程。 我们的课程内容涵盖了云原生技术的基础概念、容器技术、微服务架构、持续集成与持续发布&#xff08;CI/CD&#…...

【数据库设计】宠物商店管理系统

目录 &#x1f30a;1 问题的提出 &#x1f30a;2 需求分析 &#x1f30d;2.1 系统目的 &#x1f30d;2.2 用户需求 &#x1f33b;2.2.1 我国宠物行业作为新兴市场&#xff0c;潜力巨大 &#x1f33b;2.2.2 我国宠物产品消费规模逐年增大 &#x1f33b;2.2.3 我国宠物主选…...

前端 JS 经典:node 的模块查找策略

前言&#xff1a;我们引入模块后&#xff0c;node 大概的查找步骤分为 文件查找、文件夹查找、内置模块查找、第三方模块查找&#xff0c;在 node 中使用 ESM 模块语法&#xff0c;需要创建 package.json 文件&#xff0c;并将 type 设置为 module。简单起见&#xff0c;我们用…...

C++中的23种设计模式

目录 摘要 创建型模式 1. 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 2. 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 3. 单例模式&#xff08;Singleton Pattern&#xff09; 4. 生成器模式&#xff08;Builder Pattern&#xff0…...

vue.js+node.js+mysql在线聊天室源码

vue.jsnode.jsmysql在线聊天室源码 技术栈&#xff1a;vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码...

浏览器无痕模式和非无痕模式的区别

无痕模式 1. 历史记录&#xff1a;在无痕模式下&#xff0c;浏览器不会保存浏览记录、下载记录、表单数据和Cookies。当你关闭无痕窗口后&#xff0c;这些信息都会被删除。
 2. Cookies&#xff1a;无痕模式会在会话期间临时存储Cookies&#xff0c;但在关闭无痕窗口…...

选服务好的网站建设公司/淘宝优化

struts控制器启动概述&#xff1a;由于web.xml中的filter-class中配置的类&#xff0c;在该类中定义了init(),dofilter(),destory()函数&#xff0c;init()函数由web服务器去调用并启动struts控制器 struts配置文件&#xff1a; strust-default.xml&#xff1a;struts核心包的根…...

拓什么设计网站/广东seo教程

如果组织科技专家、企业家和CEO来一场关于Android Vs. iPhone的辩论赛&#xff0c;其激烈程度肯定丝毫不会亚于关于医保或经济的政治辩论。 智能手机已成为我们生活密不可分的一部分&#xff0c;其重要程度远超过所有配件饰物。事实上&#xff0c;很多用户都是带着他们的爱机入…...

哈尔滨百度推广电话/seo顾问服务福建

这是TOGAF的口袋指南&#xff0c;一个开放的组标准&#xff0c;版本9.1。它的目的是帮助架构师专注于他们的组织的高效和有效的运作&#xff0c;高级管理人员了解TOGAF的基础知识。 This is the Pocket Guide to TOGAF, an Open Group Standard, Version 9.1. It is intended …...

wordpress表单微信/怎样建立自己网站

第二课&#xff1a; 执行shell脚本的几种方式 chmod x shtest.sh./ shtest.shsh shtest.sh管道操作find /etc -name "*.conf" | wc -lps aux | grep httpdbash shtest.shsource shtest.sh重定向cat version.txt version.txt2 &> error.txt < 从文本中写入…...

上海网站建设目的/国内最新十大新闻

条款37 决不要重新定义继承而来的非虚函数 实践依据 假设类D公有继承于类B, B中定义了公有成员函数mf; mf的参数和返回类型假设为void; 12345678class B {public:void mf();...};class D: public B { ... };//D x; // x 是类型D 的一个对象那么, 如果这么做: ] 12B *pB &a…...

长沙做网站找哪家好/站长工具ip地址查询域名

一、简介Flink 1.9以后新增一个SQL DDL 的新特性&#xff0c;本文介绍从kafka消费基本操作如下。二、版本及创建表插件版本: flink 1.10.1 kafka 0.9DDL建表&#xff1a;CREATE TABLE source_table (id BIGINT, name STRING, score BIGINT) WITH (connector.type kafk…...