Tesseract识别图片提取文字&字库训练-程序员宅基地

技术标签: git  java  runtime  

   文中测试了3.0和4.0两个版本。发现3.0识别效率不准确,需要训练词库。4.0识别效率就比较高了,而且支持结果生成pdf、txt等格式。所以推荐使用4.0版本。

  这个工具可以用在爬虫的时候获取验证码进行识别且自动输入验证码的功能。

  git地址:https://github.com/tesseract-ocr/tesseract

  下载地址:https://digi.bib.uni-mannheim.de/tesseract/

1.下载安装

  我下载的是 3.05.01,自带了中文词库。

下载完成后目录结构:

 

2.测试识别

0.准备一张文字图片

1.添加环境变量到path中,可以直接使用tesseract命令。检查是否配置成功

C:\Users\Administrator\Desktop\新建文件夹>tesseract -v
tesseract 3.05.01
 leptonica-1.74.1
  libgif 4.1.6(?) : libjpeg 8d (libjpeg-turbo 1.5.0) : libpng 1.6.20 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.3 : libopenjp2 2.1.0

 

查看命令可以携带的参数:

PS C:\Users\Administrator\Desktop\新建文件夹> tesseract
Usage:
  E:\tesseract\Tesseract-OCR\tesseract.exe --help | --help-psm | --help-oem | --version
  E:\tesseract\Tesseract-OCR\tesseract.exe --list-langs [--tessdata-dir PATH]
  E:\tesseract\Tesseract-OCR\tesseract.exe --print-parameters [options...] [configfile...]
  E:\tesseract\Tesseract-OCR\tesseract.exe imagename|stdin outputbase|stdout [options...] [configfile...]

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  --psm NUM             Specify page segmentation mode.
  --oem NUM             Specify OCR Engine mode.
NOTE: These options must occur before any configfile.

Page segmentation modes:
  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.
 11    Sparse text. Find as much text as possible in no particular order.
 12    Sparse text with OSD.
 13    Raw line. Treat the image as a single text line,
                        bypassing hacks that are Tesseract-specific.
OCR Engine modes:
  0    Original Tesseract only.
  1    Cube only.
  2    Tesseract + cube.
  3    Default, based on what is available.

Single options:
  -h, --help            Show this help message.
  --help-psm            Show page segmentation modes.
  --help-oem            Show OCR Engine modes.
  -v, --version         Show version information.
  --list-langs          List available languages for tesseract engine.
  --print-parameters    Print tesseract parameters to stdout.

 

 2.进入cmd,进入到要识别的图片的路径下。

C:\Users\Administrator\Desktop\新建文件夹>tesseract ./1.jpg re
Error opening data file \tesseract\Tesseract-OCR\tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Could not initialize tesseract.

 

发现报错没有语言,解决办法: 将  tesseract 安装目录下的  tessdata 文件夹配置到环境变量  TESSDATA_PREFIX  

C:\Users\Administrator>set TESSDATA_PREFIX
TESSDATA_PREFIX=E:\tesseract\Tesseract-OCR\tessdata

3.再次测试

C:\Users\Administrator\Desktop\新建文件夹>tesseract ./1.png re
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

   会生成一个re.txt文件,内容如下:(发现中文乱码)

 4.解决中文乱码问题:加 -l 参数指定语言即可

(1)查看支持的语言

C:\Users\Administrator\Desktop\新建文件夹>tesseract --list-langs
List of available languages (107):
afr
amh
ara
。。。

 

(2)使用  chi_sim 识别图片

C:\Users\Administrator\Desktop\新建文件夹>tesseract -l chi_sim ./1.png re
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

 3.测试复杂的中文识别---词库训练

 1.原来图片如下

 

 

2. 识别之后的内容如下

 

3.解决上面的问题---利用jTessBoxEditor工具进行Tesseract3.02.02样本训练

  此工具基于java运行,所以需要安装java环境。

1.下载   jTessBoxEditor :http://tenet.dl.sourceforge.net/project/vietocr/jTessBoxEditor/jTessBoxEditor-1.5.zip

2.解压运行

$ java -jar jTessBoxEditor.jar

 

 

3. 将上面的图片转换成tif格式,用于后面生成box文件。可以通过画图,然后另存为tif即可

tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言 fontname是字体 
比如我们要训练自定义字库 mylan 字体名normal
那么我们把图片文件重命名 mylan.normal.exp0.jpg在转tif。(画图工具中另存为就可以)

 

4.生成box文件。

tesseract mylan.normal.exp0.jpg mylan.normal.exp0 -l chi_sim batch.nochop makebox

 

box文件和对应的tif一定要在相同的目录下,不然后面打不开。会生产一个box文件。

 

 

5.打开jTessBoxEditor矫正错误并训练

 打开train.bat

 

 找到tif图,打开,并校正。(校正完保存即可)

 

 6、训练。

(1) 只要在命令行输入命令即可。(执行第一条命令会生产.tr文件,也可以先执行一次然后删掉tr测试是否可以训练)

tesseract  mylan.normal.exp0.jpg mylan.normal.exp0  nobatch box.train


unicharset_extractor mylan.normal.exp0.box

或者输入两个合并执行的命令:

tesseract  mylan.normal.exp0.jpg mylan.normal.exp0  nobatch box.train && unicharset_extractor mylan.normal.exp0.box

 

 如下证明全部识别完毕:

 

(2)新建一个font_properties文件

里面内容写入 normal 0 0 0 0 0 表示默认普通字体 (要求normal与上面的字体名称必须一致),下面是命令直接重定向(注意重定向>和>>的区别是>是覆盖模式,>>是追加模式):

echo normal 0 0 0 0 0 >> font_properties

 

(3)继续敲命令:

shapeclustering -F font_properties -U unicharset mylan.normal.exp0.tr

mftraining -F font_properties -U unicharset -O unicharset mylan.normal.exp0.tr

cntraining mylan.normal.exp0.tr

或者一次性执行下面命令:

shapeclustering -F font_properties -U unicharset mylan.normal.exp0.tr && mftraining -F font_properties -U unicharset -O unicharset mylan.normal.exp0.tr && cntraining mylan.normal.exp0.tr

 

最后会生成五个文件,把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上normal.

如图:

或者执行如下命令进行重命名:

mv ./unicharset ./normal.unicharset && mv ./inttemp ./normal.inttemp && mv ./pffmtable ./normal.pffmtable && mv ./shapetable ./normal.shapetable && mv ./normproto ./normal.normproto

 

(4)命令行输入,合并五个文件:

combine_tessdata normal.

得到训练好的字库。

 

(5)把 normal.traineddata 复制到Tesseract-OCR 安装目录下的tessdata文件夹中

或者执行以下命令即可:( TESSDATA_PREFIX 是配置的环境变量)

mv ./normal.traineddata $TESSDATA_PREFIX

或者执行复制命令:

cp ./normal.traineddata $TESSDATA_PREFIX

 

 7.测试:

识别命令:(可以使用两种语言,也可以使用一种语言)

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract mylan.normal.exp0.jpg result -l normal
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract mylan.normal.exp0.jpg result2 -l normal+chi_sim
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

结果:(上面的   result   是指定生成的txt文件的前缀   )

 

补充:用notepad++打开之后会发现有换行:

 

  这个需要大量的训练词库。不知道是否有更好的解决办法。

 

补充:一个Java程序调用runtime执行本地命令,并读取生成的文件内容:

package cn.xm.exam.test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.apache.xmlbeans.impl.common.IOUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ibm.wsdl.util.IOUtils;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) throws IOException {
        // 执行命令生成文件
        String cmd = "E:/tesseract/Tesseract-OCR/tesseract.exe G://test.jpg G://tmp -l normal+chi_sim";
        boolean exec = exec(cmd);
        if (exec) {
            String readFileToString = FileUtils.readFileToString(new File("G://tmp.txt"));
            System.out.println(readFileToString);
        }
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();
            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        return true;
    }
}

结果:(会将换行也读取出来)

1 23456
这是一告测试中文
不能告诉@154856.text
电话:1 8434391 711

 

=====下面研究 Tesseract  4.0版本的使用(推荐使用这个版本)=========

  官方对  Tesseract4.0 版本做了很多的改进,而且自带的语言库也增加了很多。下面研究在4.0版本的识别。经过研究,4.0版本是可以直接拿来就用的,都不用训练词。识别为pdf的准确率更加高,所以在实际中可以识别为pdf然后用apache-tika提取pdf的内容。这样识别率更加的高效。

1. 下载安装

2.修改环境变量为最新的4.0版本并测试

$ tesseract --version
tesseract v4.0.0.20181030
 leptonica-1.76.0
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.3) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.2.0

 

3.接下来还是对上面的带中文的进行识别

tesseract ./1.jpg result -l chi_sim

 

结果:(识别率已经非常准确了)

 

 4.测试将识别结果直接提取为字符串、存储为pdf(双层pdf)或者xml

(1)直接提取为文本

$ tesseract ./1.jpg stdout -l chi_sim
123456
这是一个测试中文

不能告诉@154856 .text
电话:18434391711

 

(2)提取为pdf

   在4.0之后可以自动将识别结果提取为pdf\txt\xml等格式的数据。

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract ./1.jpg result -l chi_sim pdf
Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica

 结果:

(3)当然可以一次性提取为多个文件,只需要在后面空格分割就可以了

tesseract ./0101.jpg result -l chi_sim pdf txt

 

结果会生成三个文件

 

5.测试识别复杂的中文图片

图片内容如下:

(1)直接提取内容到输出控制台

$ tesseract ./0101.jpg stdout -l chi_sim


一个车者对禅师说: “我放不下一-些事放不下一些人。”

禅师说没有什么东西是真正放不下的。苦者说: 可我就信信放不下.

禅师递给他一个水杯然后就入里面侠     -直例到水溢出来。贡者被通到马_上松开了手,水杯掉在
地上摔坏了。

禅师说:其实,这个世界_上没有什么事是放不下的,痛了,你自然就会放下

土者说到“我能换个水杯吗?

禅师微微一笑道:“可以”他从包里拿出一一个水杯 ,说到再试试吧 , 禅师又往水杯里倒水,水溢出
来 , 这次他没有放手

祥岳问道:“不汤吗”?苦者说“和”

禅师又问“为何不放手?”葫者说道“这水杯是她送的。禅师回头叹“番狗是真的牛通

 

 

(2)查看提取tx和pdf的效率

$ tesseract ./0101.jpg result -l chi_sim pdf txt

 

txt和控制台的结果一样:

 

pdf识别结果更加准确:(接近百分之百)

 

   经过上面的实验发现啊,pdf的识别是识别的双层pdf,我自己的一种思路就是:将识别结果存到pdf,然后用ApacheTika提取pdf的内容,这样识别效率应该会更加准确。

 

6. java中调用runtime获取识别结果和提取为pdf之后用ApacheTika提取pdf内容

(1)读取内容到字符串中

package zd.dms.utils.ebuy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.tika.exception.TikaException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(PlainTest.class);

    public static void main(String[] args) throws IOException, SAXException, TikaException {
        // 执行命令生成文件
        String cmd = "E:/tesseract4/Tesseract-OCR/tesseract.exe G://0101.jpg stdout -l chi_sim";
        boolean exec = exec(cmd);
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        String result = "";
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();

            // 获取其正常的输出流
            InputStream inputStream = process.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader br = new BufferedReader(inputStreamReader);
            String line = null;
            while ((line = br.readLine()) != null) {
                result += line;
            }

        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        // result就是获取到的结果
        System.out.println(result);
        return true;
    }
}

结果:

  一个车者对禅师说: “我放不下一-些事放不下一些人。”禅师说没有什么东西是真正放不下的。苦者说: 可我就信信放不下.禅师递给他一个水杯然后就入里面侠     -直例到水溢出来。贡者被通到马_上松开了手,水杯掉在地上摔坏了。禅师说:其实,这个世界_上没有什么事是放不下的,痛了,你自然就会放下土者说到“我能换个水杯吗?禅师微微一笑道:“可以”他从包里拿出一一个水杯 ,说到再试试吧 , 禅师又往水杯里倒水,水溢出来 , 这次他没有放手祥岳问道:“不汤吗”?苦者说“和”禅师又问“为何不放手?”葫者说道“这水杯是她送的。禅师回头叹“番狗是真的牛通     

 

(2)读取内容到pdf中然后tika读取pdf

package zd.dms.utils.ebuy;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.BodyContentHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(PlainTest.class);

    public static void main(String[] args) throws IOException, SAXException, TikaException {
        // 执行命令生成文件
        String cmd = "E:/tesseract4/Tesseract-OCR/tesseract.exe G://0101.jpg G://result -l chi_sim pdf";
        boolean exec = exec(cmd);
        if (exec) {
            BodyContentHandler handler = new BodyContentHandler();
            Metadata metadata = new Metadata();
            FileInputStream inputstream = new FileInputStream(new File("G://result.pdf"));
            ParseContext pcontext = new ParseContext();

            // parsing the document using PDF parser
            PDFParser pdfparser = new PDFParser();
            pdfparser.parse(inputstream, handler, metadata, pcontext);

            // getting the content of the document
            System.out.println("Contents of the PDF :" + handler.toString());
        }
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();
            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        return true;
    }
}

结果:

个对禅师说 “我放 不 一-些事放不一 。”
禅师说没有什么东西是真正不下的 者可我信不.
禅师递给一水杯然后入里面侠 -直例到水溢出来 者通到马上松了手,水掉
摔了。
禅师 :其,这个世界上没有什么事是不下 , 痛了 , 你自然就放下
者到 “我能换个水杯?
禅师微微笑 :“可以”他里拿出一水,说到再试试吧 , 禅师又往水杯里倒水 ,水溢出

 

来 , 这次他没有放手
祥岳 问 不汤”? 者 “和”
禅师又 何不放手?”者 “这水杯她送的 禅师回头 “番真牛通

 

 

  git上面的文档对4.0最新的每个命令都有介绍,参照git上的doc文件夹下面对每个文件的介绍:https://github.com/tesseract-ocr/tesseract/tree/master/doc

 

转载于:https://www.cnblogs.com/qlqwjy/p/10273543.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30426065/article/details/98838892

智能推荐

顺序表、链表相关OJ题(1)-程序员宅基地

文章浏览阅读9.6k次,点赞128次,收藏118次。本文为经典算法OJ题练习,大部分题型都有多种思路,每种思路的解法博主都试过了(去网站那里验证)是正确的,大家可以参考!!

拦截驱动加载_pimage_nt_headers64 pntheaders64 = (pimage_nt_head-程序员宅基地

文章浏览阅读1.5k次。思路简单粗暴,直接注册一个模块监听,然后当目标驱动加载时hook它的驱动加载函数,直接返回成功,对付一下比较简单的驱动保护效果屡试不爽获取DriverEntryPVOID GetDriverEntryByImageBase(PVOID ImageBase){ PIMAGE_DOS_HEADER pDOSHeader; PIMAGE_NT_HEADERS64 pNTHeader; PVOID pEntryPoint; pDOSHeader = (PIMAGE_DOS_HEADER)ImageB_pimage_nt_headers64 pntheaders64 = (pimage_nt_headers64)((ulong64)hmod + pdo

@ConfigurationProperties和@ConditionalOnProperties的理解与使用_configurationonproperties-程序员宅基地

文章浏览阅读7.1k次,点赞6次,收藏9次。在SpringBoot中为了降低耦合度,简化开发,有很多方便的注解,其中@COnfigurationProperties和@ConditionalOnProperties就只个人觉得比较好用的组件中的两个@ConfigurationProperties的用法这个注解可以根据配置文件中的配置绑定相关属性到有这个注解的类上其中有四个静态方法 @AliasFor("prefix") Stri..._configurationonproperties

Visio标注、批注位置_visio标注总跑到图形中心-程序员宅基地

文章浏览阅读2.6k次。标注、批注_visio标注总跑到图形中心

CSS3实例教程:hover、active和:focus伪选择器。-程序员宅基地

文章浏览阅读548次。 CSS3的伪类选择器就是多,今天我们来学习新的伪类选择器——UL状态伪类选择器。这些选择器都有一个共同的特征名那就是定义的样式只有当元素处于某种状态下时才起作用,在默认状态下无效。  今天我们先来接触:hover、active和:focus这三种状态伪类选择器。:hover选择器、:active选择器和:focus选择器  :hover选择器:当鼠标悬停在所指定的元素上时所使用的样式;  ..._css3 active

微信小程序使用getlocation和chooselocation得到的坐标不一致的原因_chooselocation和getlocation-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏4次。这也是一个新手容易犯的错误,技术文档中可以找到wx.getlocation得到的默认坐标系是wgs84即GPS坐标系,但是在chooselocation和openlocation中并未再次提及坐标系type,其实在wx.getlocation中提及过默认返回wgs84,但是可以通过制定type为gcj02用于openlocation,同样在wx.openlocation中的示例也用到了这点:其实只有wx.gentlocation默认返回的是gps系,而其他方法都使用的是火星坐标系也就是gcj02,..._chooselocation和getlocation

随便推点

DAY8 Python入门-程序员宅基地

文章浏览阅读232次。方法没有重载在其他语言中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含三个部分:方法名、参数数量、参数类型。Python中,方法的参数没有类型(调用时确定参数类型),参数的数量也可以由可变参数控制。因此,Python方法中是没有方法重载的。定义一个方法即可有多种调用方式。相当于实现了其他语言中的方法的重载。如果我们在类体中定义了多个重名的方法,只有最后一个方法有效。建议: 不要使用重名的方法,Python中方法没有重载。class Person: def say_hi(s

理解Docker容器网络之Linux Network Namespace_veth addrgenmode-程序员宅基地

文章浏览阅读695次。点击查看原文更多精彩内容由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间。随着当前项目对Kubernetes应用的深入,我感觉之前对于容器网络的粗浅理解已经不够了,容器网络成了摆在前面的“一道坎”。继续深入理解K8s网络、容器网络已经势在必行。而这篇文章就算是一个重新开始,也是对之前浅表理解的一个补充。我还是先从Docker容器网络入手,虽然Dock_veth addrgenmode

PE文件解析-文件头与整体介绍_pe文件头作用-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏48次。一、PE的基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名。 认识PE文件不是作为单一内存映射文件被装入内存是很重要的。Windows加载器(又称PE加载器)遍历PE文件并决定文件的哪一部分被映射,这种映射方式是将文件较高的偏移..._pe文件头作用

Charles(HTTP抓包工具软件)中文版_charles中文版-程序员宅基地

文章浏览阅读2.6w次,点赞3次,收藏27次。Charles安装教程1、解压文件包之后双击打开“Charles 64位_4.2.7.4.msi”开始安装2、点击“Next”3、勾选“我同意条款”,然后点击“Next”4、选择软件要安装的目录,然后点击“Next”5、点击“Install”6、点击“Finish”完成安装教程1、我们打开“Charles 汉化&授权.exe”,选择“中文注册版”,然后点击“Patch”即可。资源地址:Charles(HTTP抓包工具软件)中文版Charles使用教程1、PC抓包由于该_charles中文版

Python-课题设计系统--67288(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案-程序员宅基地

文章浏览阅读627次,点赞28次,收藏23次。本系统采用的数据库是Mysql,使用python语言,使用django技术进行开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

Centos 7.x 源码安装Ansible参考篇_centos 安装 ansible 国内源-程序员宅基地

文章浏览阅读956次。Ansible架构图_centos 安装 ansible 国内源

推荐文章

热门文章

相关标签