百度站长平台账号购买/成都爱站网seo站长查询工具

百度站长平台账号购买,成都爱站网seo站长查询工具,视频解析网站怎么做的,yy直播频道一、概述 在上一篇文章中,我们一起学习了STDF格式的文件,知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后,好比掌握了切入半导体行业的金钥匙。 从今天开始,我们一起来一步步地学习如何解构、熟…

一、概述

在上一篇文章中,我们一起学习了STDF格式的文件,知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后,好比掌握了切入半导体行业的金钥匙。

从今天开始,我们一起来一步步地学习如何解构、熟悉、掌握、玩弄这个STDF。并最终尝试写一个完整的 STDF解析器,最后发布到网上成为一个公共库。

了解这个文件,首先需要了解STDF的标准。我们知道,了解标准是一件很繁琐的事情,所以我们现在要做的是一步步开始,从创建和读取最简单的stdf格式的文件作为起始点,逐步探索STDF的核心。

实际上PYTHON 已经有两种第三方库来读取STDF文件,但经过我的测试,并不是很理想,多数时候会在读取STDF的时候报错,或者漏掉一些关键信息。所以,我们今天徒手来盘弄这个stdf文件。

二、文件结构

一个基本的STDF文件,结构是这样的:

STDF File
├── Record (repeated for each record in the file)
│   ├── Header (6 bytes)
│   │   ├── REC_LEN (2 bytes) : Record Length (total length of the record including header)
│   │   ├── REC_TYP (1 byte)  : Record Type (identifies the kind of record)
│   │   └── REC_SUB (1 byte)  : Record Sub-Type (further specifies the record type)
│   └── Body (variable length, depending on REC_TYP and REC_SUB)
│       ├── Field (repeated for each field in the record)
│       │   ├── Field Name    : Descriptive name for the field
│       │   ├── Data Type     : Specifies the data type of the field
│       │   └── Value         : The actual data stored in the field
│       └── [Additional Fields as specified by the record type]
└── [More Records as needed]

 上面的内容可以看出,标准STDF包含了 头文件 和记录文件 两个主要内容。

其中

  • REC TYPE 是主记录的标识。
  • REC_SUB 是主记录下的子标识。

以下是STDF的全部记录类型

今天我们要创建一个最简单的带有头文件的STDF格式文件,就需要理解STDF(Standard Test Data Format)的基本结构。STDF是一种二进制格式,用于半导体测试设备之间交换测试数据。每个STDF记录由一个固定长度的头和可变长度的数据字段组成。

根据标准,我们知道每个STDF记录都包含一个头部,该头部至少包括三个字段:记录长度、记录类型(REC_TYP)、记录子类型(REC_SUB)。我们将创建一个最小的STDF文件,它将仅包含File Attributes Record (FAR) 和 Master Information Record (MIR),因为它们是每个STDF文件必需的。

 它的格式如下:

STDF File
├── FAR (File Attributes Record)
│   ├── Header (6 bytes)
│   │   ├── REC_LEN (2 bytes) : Length of FAR record including header
│   │   ├── REC_TYP (1 byte)  : 0 (for FAR)
│   │   └── REC_SUB (1 byte)  : 10 (for FAR)
│   └── Body (variable length)
│       ├── Version           : STDF version number (1 byte)
│       └── CPU_Type          : Type of CPU used to generate the file (1 byte)
├── MIR (Master Information Record)
│   ├── Header (6 bytes)
│   │   ├── REC_LEN (2 bytes) : Length of MIR record including header
│   │   ├── REC_TYP (1 byte)  : 1 (for MIR)
│   │   └── REC_SUB (1 byte)  : 10 (for MIR)
│   └── Body (variable length)
│       ├── Head Count        : Number of test heads (2 bytes)
│       ├── Site Count        : Number of test sites per head (2 bytes)
│       ├── Date/Time First Part Tested (4 bytes each)
│       ├── Date/Time Last Part Tested (4 bytes each)
│       ├── Test Operator     : ID of the operator who ran the tests (variable length string)
│       ├── Test Station ID   : ID of the station where tests were performed (variable length string)
│       ├── Lot ID            : Identifier for the lot being tested (variable length string)
│       ├── Wafer ID          : Identifier for the wafer being tested (variable length string)
│       └── Flat/Notch Indicator: Orientation of the wafer flat or notch (1 byte)
└── [Potentially more records, depending on the file content]

三、文件创建

以下是Python代码示例,它将创建一个简单的STDF文件,其中包含FAR和MIR记录:

import structdef create_stdf_file(filename):# FAR - File Attributes Recordfar_rec_typ = 0  # Record Type for FARfar_rec_sub = 10  # Record Subtype for FARfar_data = b'\x04\x00'  # Version and CPU type, example values# MIR - Master Information Recordmir_rec_typ = 1  # Record Type for MIRmir_rec_sub = 10  # Record Subtype for MIRmir_data = (b'\x02\x00' +  # Head count, site countb'\xFF\xFF' +  # Date of first part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of first part tested (not used)b'\xFF\xFF' +  # Date of last part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of last part tested (not used)b'\x00\x00\x00\x00' +  # Test Operator (not used)b'\x00\x00\x00\x00' +  # Test Station ID (not used)b'\x00\x00\x00\x00' +  # Lot ID (not used)b'\x00\x00\x00\x00' +  # Wafer ID (not used)b'\x00\x00\x00\x00'  # Flat/notched indicator (not used))with open(filename, 'wb') as f:# Write FAR recordfar_length = len(far_data) + 4  # Including header lengthfar_header = struct.pack('>HBB', far_length, far_rec_typ, far_rec_sub)f.write(far_header + far_data)# Write MIR recordmir_length = len(mir_data) + 4  # Including header lengthmir_header = struct.pack('>HBB', mir_length, mir_rec_typ, mir_rec_sub)f.write(mir_header + mir_data)create_stdf_file('simple.stdf')

代码解释:

这段代码用于创建一个简单的 STDF 文件,并写入两个类型的记录:FAR(File Attributes Record)和 MIR(Master Information Record)。它会按照 STDF 格式组织数据,并将其写入文件。

1. 导入模块

import struct
  • struct 模块用于处理二进制数据的打包(packing)和解包(unpacking),即将数据转换为字节流,这在读取或写入二进制文件时非常有用。

2. 定义 create_stdf_file 函数

def create_stdf_file(filename):
  • 这是定义的一个函数,接收文件名 filename 作为参数,用来生成 STDF 文件。

3. FAR(File Attributes Record)记录

# FAR - File Attributes Record
far_rec_typ = 0  # Record Type for FAR
far_rec_sub = 10  # Record Subtype for FAR
far_data = b'\x04\x00'  # Version and CPU type, example values
  • FAR 记录的类型和子类型分别是 0 和 10。它用于存储与文件相关的属性(解析的时候,可以对照标准中的表来解析)。
  • far_data = b'\x04\x00' 是一个示例字节数据,这里表示 类型的信息。数据是字节串(bytes)。

4. MIR(Master Information Record)记录

# MIR - Master Information Record
mir_rec_typ = 1  # Record Type for MIR
mir_rec_sub = 10  # Record Subtype for MIR
mir_data = (b'\x02\x00' +  # Head count, site countb'\xFF\xFF' +  # Date of first part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of first part tested (not used)b'\xFF\xFF' +  # Date of last part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of last part tested (not used)b'\x00\x00\x00\x00' +  # Test Operator (not used)b'\x00\x00\x00\x00' +  # Test Station ID (not used)b'\x00\x00\x00\x00' +  # Lot ID (not used)b'\x00\x00\x00\x00' +  # Wafer ID (not used)b'\x00\x00\x00\x00'  # Flat/notched indicator (not used)
)
  • MIR 记录的类型和子类型分别是 1 和 10。它用于存储关于测试的主信息,如测试设备、测试站等。
  • mir_data 是一个字节串,包含多个字段的示例数据。每个字段都使用字节串表示。例如,b'\x02\x00' 是头计数和站点计数的占位符,b'\xFF\xFF' 表示未使用的字段。

5. 打开文件并写入数据

with open(filename, 'wb') as f:
  • 使用 with open(filename, 'wb') 打开文件并准备以二进制模式('wb')写入文件。这意味着文件中的数据将按字节流写入。

6. 写入 FAR 记录

# Write FAR record
far_length = len(far_data) + 4  # Including header length
far_header = struct.pack('>HBB', far_length, far_rec_typ, far_rec_sub)
f.write(far_header + far_data)
  • far_length = len(far_data) + 4 计算 FAR 记录的总长度,包含了记录头部的 4 字节(2 字节长度字段,1 字节类型字段,1 字节子类型字段)。
  • far_header = struct.pack('>HBB', far_length, far_rec_typ, far_rec_sub) 使用 struct.pack 将 FAR 记录的头部打包成字节流:
    • >H 表示一个 2 字节的无符号短整型,表示记录的长度。
    • B 表示一个字节的无符号字符型,分别表示记录类型和子类型。
  • 然后通过 f.write(far_header + far_data) 将头部和数据一起写入文件。

7. 写入 MIR 记录

# Write MIR record
mir_length = len(mir_data) + 4  # Including header length
mir_header = struct.pack('>HBB', mir_length, mir_rec_typ, mir_rec_sub)
f.write(mir_header + mir_data)
  • mir_length = len(mir_data) + 4 计算 MIR 记录的总长度,同样包括头部的 4 字节。
  • mir_header = struct.pack('>HBB', mir_length, mir_rec_typ, mir_rec_sub) 使用 struct.pack 打包 MIR 记录的头部。
  • 然后通过 f.write(mir_header + mir_data) 将头部和数据一起写入文件。

8. 调用函数

create_stdf_file('simple.stdf')
  • 这行代码调用 create_stdf_file 函数并将 'simple.stdf' 作为文件名传入,创建并写入 STDF 文件。

四、读取和解析文件

读取和解析文件,相对逻辑就比较容易了,因为我们已经有了创建文件的逻辑,所以反着来就行了!

为了读取并打印STDF文件的内容,我们需要编写一个Python脚本来解析二进制数据。下面是一个简单的例子,它会读取我们之前创建的最简STDF文件,并打印出每个记录的头部信息。

import structdef parse_stdf_file(filename):with open(filename, 'rb') as f:# 读取 FAR (File Attributes Record)far_header = f.read(4)far_length, far_rec_typ, far_rec_sub = struct.unpack('>HBB', far_header)far_data = f.read(far_length - 4)  # 读取 FAR 数据print(f"FAR Record (Length: {far_length}):")print(f"  Record Type: {far_rec_typ}")print(f"  Record Subtype: {far_rec_sub}")print(f"  FAR Data: {far_data.hex()}")# 读取 MIR (Master Information Record)mir_header = f.read(4)mir_length, mir_rec_typ, mir_rec_sub = struct.unpack('>HBB', mir_header)mir_data = f.read(mir_length - 4)  # 读取 MIR 数据print(f"\nMIR Record (Length: {mir_length}):")print(f"  Record Type: {mir_rec_typ}")print(f"  Record Subtype: {mir_rec_sub}")print(f"  MIR Data: {mir_data.hex()}")# 解析 MIR 数据(可根据需要进一步解析每个字段)print("\nParsed MIR Data:")print(f"  Head Count and Site Count: {struct.unpack('>H', mir_data[0:2])[0]}")print(f"  Date of First Part Tested (not used): {mir_data[2:4].hex()}")print(f"  Time of First Part Tested (not used): {mir_data[4:8].hex()}")print(f"  Date of Last Part Tested (not used): {mir_data[8:10].hex()}")print(f"  Time of Last Part Tested (not used): {mir_data[10:14].hex()}")print(f"  Test Operator (not used): {mir_data[14:18].hex()}")print(f"  Test Station ID (not used): {mir_data[18:22].hex()}")print(f"  Lot ID (not used): {mir_data[22:26].hex()}")print(f"  Wafer ID (not used): {mir_data[26:30].hex()}")print(f"  Flat/Notched Indicator (not used): {mir_data[30:34].hex()}")# 调用函数解析并打印内容
parse_stdf_file('simple.stdf')

代码解释:

以下是对我提供的 Python 代码的概要解释:

1. parse_stdf_file(filename) 函数

该函数用于解析 .stdf 文件并打印文件中包含的记录数据。

2. 打开文件

with open(filename, 'rb') as f:

使用 open 函数以二进制模式读取文件 ('rb')。with 语句确保文件在读取后被自动关闭。

3. 读取和解析 FAR(File Attributes Record)

far_header = f.read(4)
far_length, far_rec_typ, far_rec_sub = struct.unpack('>HBB', far_header)
far_data = f.read(far_length - 4)
  • 首先,读取 FAR 记录的头部(4 字节)。
  • 使用 struct.unpack 解包头部数据,>HBB 表示将数据按大端格式解包为:1 个 unsigned short(2 字节)表示 far_length,2 个 unsigned char(1 字节)分别表示 far_rec_typfar_rec_sub
  • 然后,读取 FAR 记录的数据部分,数据长度为 far_length - 4(因为头部已经占用 4 字节)。

4. 打印 FAR 记录内容

print(f"FAR Record (Length: {far_length}):")
print(f"  Record Type: {far_rec_typ}")
print(f"  Record Subtype: {far_rec_sub}")
print(f"  FAR Data: {far_data.hex()}")
  • 打印 FAR 记录的长度、类型和子类型。
  • 将 FAR 数据转为十六进制格式进行打印(far_data.hex())。

5. 读取和解析 MIR(Master Information Record)

mir_header = f.read(4)
mir_length, mir_rec_typ, mir_rec_sub = struct.unpack('>HBB', mir_header)
mir_data = f.read(mir_length - 4)
  • 读取 MIR 记录的头部(4 字节)并解包,获取 mir_lengthmir_rec_typmir_rec_sub
  • 读取 MIR 数据部分,数据长度为 mir_length - 4(同样考虑到头部的 4 字节)。

6. 打印 MIR 记录内容

print(f"\nMIR Record (Length: {mir_length}):")
print(f"  Record Type: {mir_rec_typ}")
print(f"  Record Subtype: {mir_rec_sub}")
print(f"  MIR Data: {mir_data.hex()}")
  • 打印 MIR 记录的长度、类型和子类型。
  • 将 MIR 数据转为十六进制格式打印。

7. 解析 MIR 数据的具体字段

print("\nParsed MIR Data:")
print(f"  Head Count and Site Count: {struct.unpack('>H', mir_data[0:2])[0]}")
print(f"  Date of First Part Tested (not used): {mir_data[2:4].hex()}")
print(f"  Time of First Part Tested (not used): {mir_data[4:8].hex()}")
...
  • 我逐个解析 MIR 数据中的各个字段。每个字段在数据流中的位置是已知的,所以下标指定了每个字段的范围。
  • 使用 struct.unpack 解析特定字段(例如 Head Count and Site Count 字段),并打印出它们的值。
  • 对于不使用的字段,直接显示它们的十六进制表示。

执行后,结果就是我们写入的内容:

五、本节小结:

1. 写入 STDF 文件代码
  • 目标:创建一个简单的 .stdf 文件并写入两个记录类型:FAR (File Attributes Record)MIR (Master Information Record)

  • 代码功能

    • FAR 记录
      • far_rec_typ:设置为 0(FAR 记录类型)。
      • far_rec_sub:设置为 10(FAR 记录子类型)。
      • far_data:包含示例数据(如 b'\x04\x00',表示版本和 CPU 类型)。
      • FAR 头部:包含 FAR 记录的长度(far_length)、类型(far_rec_typ)和子类型(far_rec_sub),然后将其与数据一起写入文件。
    • MIR 记录
      • mir_rec_typ:设置为 1(MIR 记录类型)。
      • mir_rec_sub:设置为 10(MIR 记录子类型)。
      • mir_data:包含多个字段的示例数据,如头计数、日期、时间等,很多字段是未使用的(例如,测试操作员、测试站点 ID 等设置为 0x00)。
      • MIR 头部:类似于 FAR 记录,包含 MIR 记录的长度(mir_length)、类型(mir_rec_typ)和子类型(mir_rec_sub),然后将其与数据一起写入文件。
      • 输出:一个名为 simple.stdf 的文件,其中包含 FAR 和 MIR 两个记录。

 

2. 读取 STDF 文件代码
  • 目标:解析刚刚生成的 .stdf 文件,读取 FAR 和 MIR 记录,并打印它们的内容。

  • 代码功能

    • 读取 FAR 记录
      • 读取 4 字节头部,获取 far_length(记录长度)、far_rec_typ(记录类型)和 far_rec_sub(记录子类型)。
      • 然后读取剩余的 far_data 并打印十六进制数据。
    • 读取 MIR 记录
      • 类似于 FAR 记录,读取 4 字节头部,获取 mir_length(记录长度)、mir_rec_typ(记录类型)和 mir_rec_sub(记录子类型)。
      • 然后读取剩余的 mir_data 并打印十六进制数据。
    • 解析 MIR 数据
      • 对 MIR 数据中的各个字段进行进一步解析,例如:头计数和站点计数、日期时间、操作员信息等,并打印它们的值。虽然很多字段在示例中没有实际使用,但可以展示它们的十六进制表示。
    • 输出

    • 读取并打印 FAR 和 MIR 记录的详细信息,包括它们的长度、类型、子类型以及数据部分的十六进制表示。
    • MIR 数据会根据字段解析逻辑显示各个字段的值,尽管示例中的很多字段未被使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OCR:文字识别

使用场景: 远程身份认证 自动识别录入用户身份/企业资质信息,应用于金融、政务、保险、电商、直播等场景,对用户、商家、主播进行实名身份认证,有效降低用户输入成本,控制业务风险 文档电子化 识别提取各类办公文档、合同文件、企…

深入C语言文件操作:从库函数到系统调用

引言 文件操作是编程中不可或缺的一部分,尤其在C语言中,文件操作不仅是处理数据的基本手段,也是连接程序与外部世界的重要桥梁。C语言提供了丰富的库函数来处理文件,如 fopen、fclose、fread、fwrite 等。然而,这些库…

linux上qt打包(二)

sudo apt install git 新建一个文件夹 名为xiazai, chmod -R 777 xiazai cd xiazai 并进入这个文件夹,然后clone git clone https://github.com/probonopd/linuxdeployqt.git 此处可能要fanQiang才能下 cd linuxdeployqt文件夹 下载平台需要的…

Windos中解决redis-server.exe闪退问题

一、闪退原因 (一)数据状态异常 数据不一致 在 Redis 运行过程中,如果发生意外情况,如突然断电、系统崩溃或者不正确的操作,可能会导致数据在内存中的存储状态不一致。例如,Redis 使用多种数据结构&#x…

【数据分享】2013-2023年我国省市县三级的逐年CO数据(免费获取\excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2023年的省市县三级的逐年PM2.5数据、2000-2023年的省市县三级的逐年PM10数据、2013-2023年的省市县三级的逐年SO2数据、2000-2023年省市县三级的逐年O3数据和2008-2023年我国省市县三级的逐…

华为WLAN基础配置(AC6005模拟配置)

AC6005基础配置 本次实验模拟华为AC6005的基本配置 Tip display interface GigabitEthernet 0/0/0 查看ap接口mac 前提条件&#xff1a;Vlan10为业务网段&#xff0c;vlan100为管理网段&#xff0c;5700作为dhcp。 5700配置如下 <Huawei>sy [Huawei]sys 5700 //设…

shell编程2 永久环境变量和字符串显位

声明 学习视频来自B站UP主 泷羽sec 常见变量 echo $HOME &#xff08;家目录 root用户&#xff09; /root cd /root windows的环境变量可以去设置里去新建 为什么输入ls dir的命令的时候就会输出相应的内容呢 因为这些命令都有相应的变量 which ls 通过这个命令查看ls命令脚本…

WebRTC服务质量(05)- 重传机制(02) NACK判断丢包

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

AI工具如何深刻改变我们的工作与生活

在当今这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经从科幻小说中的概念变成了我们日常生活中不可或缺的一部分。从智能家居到自动驾驶汽车&#xff0c;从医疗诊断到金融服务&#xff0c;AI正以惊人的速度重塑着我们的世界。 一、工作方式的革新…

基于matlab的单目相机标定

链接&#xff1a; 单目相机标定&#xff08;使用Matlab&#xff09; 用Matlab对单目相机参数的标定步骤&#xff08;保姆级教程&#xff09; 1.准备代码 调用摄像头代码&#xff08;用于测试摄像头是否可用&#xff09;&#xff1a; #https://blog.csdn.net/qq_37759113/art…

[maven]使用spring

为了更好理解springboot&#xff0c;我们先通过学习spring了解其底层。 这里讲一下简单的maven使用spring框架入门使用。因为这一块的东西很多都需要联合起来后才好去细讲&#xff0c;本篇通过spring-context大致地介绍相关内容。 注意&#xff1a;spring只是一个框架&#xff…

eBay如何养号?新手养号宝典

​ebay是热门的跨境电商平台之一&#xff0c;然而与其他跨境电商平台不同&#xff0c;不同等级的ebay账户可刊登的数量是不同的。对于新手来说&#xff0c;想要提升ebay账户的等级就需要养号。那ebay如何养号&#xff1f;本文将带来一些实用的养号策略&#xff0c;帮助新手快速…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

梳理你的思路(从OOP到架构设计)_UML应用:业务内涵的分析抽象表达03

目录 1、举例(四)&#xff1a;五子棋 【五子棋】 的分析步骤 2、讨论&#xff1a; 模型与代码 1、举例(四)&#xff1a;五子棋 【五子棋】 的分析步骤 Step-1: 找到主角— 棋手&#xff0c;很容易发现核心的概念了&#xff0c;例如&#xff1a;五子棋游戏的主角是棋手(玩家…

人员离岗监测摄像机智能人员睡岗、逃岗监测 Python 语言结合 OpenCV

在安全生产领域&#xff0c;人员的在岗状态直接关系到生产流程的顺利进行和工作环境的安全稳定。人员离岗监测摄像机的出现&#xff0c;为智能人员睡岗、逃岗监测提供了高效精准的解决方案&#xff0c;而其中的核心技术如AI识别睡岗脱岗以及相关的算法盒子和常见的安全生产AI算…

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer&#xff08;传输层如何进行分用&#xff09;分用&#xff08;Demultiplexing&#xff09;的定义&#xff1a;TCP/UDP段格式&#xff1a; UDPUDP的特点&#xff1a;UDP Format端口号Trivial File Transfer Protocol…

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景&#xff1a;国产化升级&#xff0c;推动道路监控产业转型 随着国家对信息安全的重视&#xff0c;国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求&#xff0c;公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…

YOLOv5-7.0训练过程中出现报错Example: export GIT_PYTHON_REFRESH=quiet

出现报错&#xff1a; This initial message can be silenced or aggravated in the future by setting the $GIT_PYTHON_REFRESH environment variable. Use one of the following values: - quiet|q|silence|s|silent|none|n|0: for no message or exception - warn…

KALI安装操作及过程

以下是在计算机上安装 Kali Linux 的详细教程&#xff1a;&#xff08;通常我直接使用虚拟机&#xff09; 解压虚拟机安装包&#xff0c;直接在虚拟机中打开KALI &#xff08;将内存改为4GB&#xff09; 初始密码账号&#xff1a;kali 一、准备工作 下载 Kali Linux 镜像文件…

Linux环境安装Jenkins

Linux环境安装Jenkins Jenkins和JDK的版本 Jenkins和JDK的版本需要对应&#xff0c;不然无法正常启动。 Jenkins稳定版下载地址 Jenkins服务 手动使用命令启动和关闭Jenkins比较麻烦&#xff0c;所以可以把Jenkins设置成开机启动。 创建Jenkins.sh文件 JAVA_HOME和jenk…