精华内容
下载资源
问答
  • 目录 1.SOP域(Start Of Packet) 2.SYNC(同步域) 3.PID域(Packet Identifier Field) 4.地址域 (1)设备地址字段 (2)端点地址字段 (3)地址域总结 ...下面这张图为组成结构,由SOP、S

    目录

    1.包的组成

    1.SOP域(Start Of Packet)

    2.SYNC(同步域)

    3.PID域(Packet Identifier Field)

    4.地址域

    (1)设备地址字段

    (2)端点地址字段

    (3)地址域总结

    5.帧号域

    (1)帧和微帧

    (2)帧号域总结

    6.数据域

    (1)数据域格式

    (2)数据域总结

    7.CRC域(循环冗余校验)

    (1)令牌CRC

    (2)数据CRC

    (3)CRC域总结

    8.EOP域(End Of Packet)

    2.包的分类


    1.包的组成

    下面这张图为包的组成结构,由SOP、SYNC、Packet Content、EOP四部分组成,其中Packet Content最为核心,Packet Content由PID、地址、帧号、数据、CRC组成。

    1.SOP域(Start Of Packet)

    通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知分组的开始(SOP)。 此开关级别表示SYNC字段的第一位。 当重新传输到小于±5 ns时,集线器必须限制SOP第一位宽度的变化。 通过将通过集线器的标称数据延迟与集线器的输出使能延迟相匹配,可以最小化失真。

    2.SYNC(同步域)

    SOP域之后就是同步域(SYNC)的开始,全速/低速设备SYNC被定义长度为8位(0000 0001),高速长度定义为32位(0000 0000 0000 0000 0000 0000 0000 0001)。 注意,这个长度是对发送端的要求。下图是一个全速/低速设备,经过NRZI编码后的波形。SYNC域中的最后两位是一个标记(电平未翻转,即受到数据1),用于标识SYNC域的结束和PID域的开始。

    3.PID域(Packet Identifier Field

    数据包标识符(PID)域紧跟在同步域之后。 PID由4位类型字段4位校验字段组成,如下图所示。类型字段主要是标识本包的类型,校验字段主要是对类型字段进行校验。为了确保接收端正确解码并识别包类型,发送端会对4位类型字段的每1位取补码赋值到4位校验字段里面,接收端也会进行校验操作,如果4位PID校验位不是它们各自的分组标识符位的补码,则存在PID错误。

    4位类型字段标识的所有包类型如下:

    4.地址域

    使用两个字段来处理功能端点:设备地址字段和端点地址字段。 任一字段上的不匹配设备都必须忽略该令牌, 访问非初始化端点设备也必须忽略该令牌。

    (1)设备地址字段

    如下图,ADDR<6:0>总共可访问128个地址。

    (2)端点地址字段

    如下图, 低速设备每个功能最多支持三个管道,端点号为零的控制管道加上两个额外的管道(两个控制管道,一个控制管道和一个中断端点,或两个中断端点),全速和高速每个功能最多可支持16个IN和OUT端点。

    (3)地址域总结

    地址是由两个地址构成,设备地址+端点地址

    5.帧号域

    (1)帧和微帧

    帧号域是11比特字段,其由主机在每帧的基础上递增。 帧号字段在达到其最大值7FFH时翻转,并且仅在每个帧(微)SOF令牌包发送并累加,说白了就是限时当前USB发了多少帧了。

    USB全速设备1ms产生一个帧,而高速设备每125us产生一个微帧,启动后永不间歇,如下图,图中SOF包中Frame标识了当前帧号。大家可以看我的另一篇文章USB帧和微帧剖析

    (2)帧号域总结

    6.数据域

    (1)数据域格式

    数据域的范围可以是0到1024字节,并且必须是整数个字节,下图显示了多个字节的格式,每个字节内的数据位首先从LSB移出。

     

    (2)数据域总结

    根据不同的传输类型,定义如下一次最大传输量。

    7.CRC域(循环冗余校验)

    (1)令牌CRC

    为令牌提供五位CRC字段,并覆盖IN,SETUP和OUT令牌的ADDR和ENDP字段或SOF令牌的时间戳字段。 PING和SPLIT特殊令牌还包括一个五位CRC字段。

    生成多项式为:  G(X)= X^5 + X^2 + 1

    (2)数据CRC

    数据CRC是应用于数据分组的数据字段的16位多项式。

    生成多项式是:G(X)= X^16 + X^15 + X^2 + 1

    表示该多项式的二进制位模式是1000000000000101B,如果没有错误地接收到所有数据和CRC位,则16位校验和将为1000000000001101B。

    (3)CRC域总结

    8.EOP域(End Of Packet)

    全速或低速设备的结束包:SE0状态用于发信号通知分组结束(EOP)。 通过将D +和D-驱动到SE0状态两位时间,然后将线路驱动到J状态一位时间来发信号通知EOP。 从SE0到J状态的转换定义了接收器处的分组的结束。 J状态被置位一个位时间,然后D +和D-输出驱动器都处于高阻态。 总线终端电阻将总线保持在空闲状态。

    注:SE0的意思是D+和D-都表示为低电平。

    2.包的分类

    每种类型的包组成会有所不同,按照组成所有的包会被分成帧首包SOF(Start of Frame)命令包(Token)数据包(Data)握手包(Handshake)四大类型。

    4种PID类型和4种包类型(按照组成分类)的区别如下,大家注意区分。

     


    1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除。

    2.未经原作者允许不得转载本文内容,否则将视为侵权;

    3.转载或者引用本文内容请注明来源及原作者;

    4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

    下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

    展开全文
  • 一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。 1.请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1 方法字段就是...

    HTTP请求报文

    一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。

    1.请求行

    请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1

    方法字段就是HTTP使用的请求方法,比如常见的GET/POST

    其中HTTP协议版本有两种:HTTP1.0/HTTP1.1 可以这样区别:

    HTTP1.0对于每个连接都只能传送一个请求和响应,请求就会关闭,HTTP1.0没有Host字段;而HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段。

    2.请求头部

    HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。

    常见的请求头字段含义:

    Accept: 浏览器可接受的MIME类型。

    Accept-Charset:浏览器可接受的字符集。

    Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

    Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

    Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

    Content-Length:表示请求消息正文的长度。

    Host: 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

    If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。

    Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

    User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

    Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。

    Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

    From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

    Connection:处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

    Range:Range头域可以请求实体的一个或者多个子范围。例如,

    表示头500个字节:bytes=0-499

    表示第二个500字节:bytes=500-999

    表示最后500个字节:bytes=-500

    表示500字节以后的范围:bytes=500-

    第一个和最后一个字节:bytes=0-0,-1

    同时指定几个范围:bytes=500-600,601-999

    但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。

    UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

    3.空行

    它的作用是通过一个空行,告诉服务器请求头部到此为止。

    4.请求数据

    若方法字段是GET,则此项为空,没有数据

    若方法字段是POST,则通常来说此处放置的就是要提交的数据

    比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。

    总的来说,HTTP请求报文格式就如下图所示:

    在这里插入图片描述
    **![HTTP的请求报文]**(https://img-blog.csdnimg.cn/20181129201321605.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzE5NTQ0NQ==,size_16,color_FFFFFF,t_70)
    上面是POST方法,它的请求行URL段中一般是没有参数的,参数放在了报文体中。而GET方法的参数直接置于请求行URL中,报文体则为空。

    HTTP响应报文

    同样的,HTTP响应报文也由三部分组成:响应行、响应头、响应体

    1.响应行

    响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK

    其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。

    //常见状态码:

    100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。

    200~299:表示成功接收请求并已完成整个处理过程。常用200

    300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)

    400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)

    500~599:服务器端出现错误,常用500

    更详细的状态码信息

    2.响应头

    响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。

    设置HTTP响应头往往和状态码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。应答头可以用来完成:设置Cookie,指定修改日期,指示浏览器按照指定的间隔刷新页面,声明文档的长度以便利用持久HTTP连接,……等等许多其他任务。

    常见的响应头字段含义:

    Allow:服务器支持哪些请求方法(如GET、POST等)。

    Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE4、IE5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept- Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

    Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

    Content- Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置 Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。

    Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

    Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。

    Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。

    Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

    Refresh:告诉浏览器隔多久刷新一次,以秒计。

    Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。

    Set-Cookie:设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。

    Transfer-Encoding:告诉浏览器数据的传送格式。

    WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\”executives\”“)。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问。

    注:设置应答头最常用的方法是HttpServletResponse的setHeader,该方法有两个参数,分别表示应答头的名字和值。和设置状态代码相似,设置应答头应该在发送任何文档内容之前进行。

    setDateHeader方法和setIntHeadr方法专门用来设置包含日期和整数值的应答头,前者避免了把Java时间转换为GMT时间字符串的麻烦,后者则避免了把整数转换为字符串的麻烦。

    HttpServletResponse还提供了许多设置

    setContentType:设置Content-Type头。大多数Servlet都要用到这个方法。

    setContentLength:设置Content-Length头。对于支持持久HTTP连接的浏览器来说,这个函数是很有用的。

    addCookie:设置一个Cookie(Servlet API中没有setCookie方法,因为应答往往包含多个Set-Cookie头)。

    3.响应体

    响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。

    HTTP响应报文格式就如下图所示
    在这里插入图片描述
    通用头、实体头

    HTTP的头域包括通用头,请求头,响应头和实体头四个部分。前面讲解了请求头和响应头,接下来看看通用头和实体头(这里可能和前面介绍的请求头、响应头有重复)。

    (1)通用头域

    通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个通用头域。

    常见通用头含义:

    Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

    Public指示响应可被任何缓存区缓存。 Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache指示请求或响应消息不能缓存 no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    Date:表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

    Pragma:用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

    (2)实体头域

    请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。

    常见实体头含义:

    Content-Encoding: 服务器通过这个头告诉浏览器数据的压缩格式。

    Content-Length: 服务器通过这个头告诉浏览器回送数据的长度。

    Content-Disposition:告诉浏览器以下载方式打开数据。

    Content-Type:服务器通过这个头告诉浏览器回送数据的类型。Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型。

    Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

    Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth

    例如,传送头500个字节次字段的形式:Content-Range:bytes0- 499/1234,如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围, Content-Length表示实际传送的字节数。

    Last-Modified:指定服务器上保存内容的最后修订时间。

    ETag:缓存相关的头

    Expires:告诉浏览器把回送的资源缓存多长时间 -1或0则是不缓存

    其中三种禁止浏览器缓存的头字段:

    Expires:-1或0

    Cache-Control:no-cache

    Pragma:no-cache

    GET、POST区别

    Http定义了与服务器交互的不同方法,最基本的方法有4种:GET、POST、PUT、DELETE。

    而HTTP中的 GET,POST,PUT,DELETE 就对应着对URL资源的 查,改,增,删 4个操作。所以说:GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

    主要区分一下get和post

    1.提交数据的形式:

    GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),会直接展现在地址栏中,以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。

    如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,

    得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

    而POST方法则会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数

    2.提交数据的大小

    get方法提交数据的大小直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响:比如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

    post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。

    所以大小的限制还是得受各个web服务器配置的不同而影响。

    3.提交数据的安全

    POST比GET方式的安全性要高

    通过GET提交数据,用户名和密码将明文出现在URL上,因为一下几个原因get方式安全性会比post弱:

    (1)登录页面有可能被浏览器缓存

    (2)其他人查看浏览器的历史纪录,那么别人就可 以拿到你的账号和密码了

    (3)当遇上跨站的攻击时,安全性的表现更差了

    展开全文
  • 图片处理成字符组成

    千次阅读 2018-07-31 21:34:02
    目录 一、环境配置 ...3.2然后安装Pillow(py图像处理库,名开头是大写注意) 4.配置notepad++运行调试环境 5.使用notepad++的一些建议 5.1由于python不认tab符所以设置成按tab间的制表符换...

     

    目录

    一、环境配置

    1.安装notepad++

    2.安装python3.7

    3.安装PIL(在Python3.7叫Pillow)

    3.1先更新(或重新安装)一下pip

    3.2然后安装Pillow(py图像处理库,包名开头是大写注意)

    4.配置notepad++运行调试环境

    5.使用notepad++的一些建议

    5.1由于python不认tab符所以设置成按tab间的制表符换为四个空格

    5.2如果不想这么做,也可以开启显示字符模式,查看tab和空格

    5.3如果对python不熟悉经常要查文档的可以将

    二、python的图片转文字

    1.图片转字符图(方法一)

    1.1探索过程

    1.2其他

    2.图片转文字图(方法二)

    3.Gif处理


    一、环境配置

    1.安装notepad++

    百度官网下载安装即可

    2.安装python3.7

    百度官网下载安装,要用就要用最新的

    3.安装PIL(在Python3.7叫Pillow)

    3.1先更新(或重新安装)一下pip

    python -m pip install --upgrade pip

    3.2然后安装Pillow(py图像处理库,包名开头是大写注意)

    pip install Pillow

    要是太慢Ctrl+c终止掉,使用清华的包源[-i https://pypi.tuna.tsinghua.edu.cn/simple]

    C:\Users\Administrator>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple n
    umpy

    4.配置notepad++运行调试环境

    依次点击 运行(ps.菜单栏中的) -管理快捷键

    把默认的F5快捷键去掉,或者换成其他的,推荐shift+F5,等下我们要用F5于是这一步是为了空出快捷键

    然后运行(ps菜单栏上的)-运行输入

    cmd /k cd "$(CURRENT_DIRECTORY)" & python "$(FILE_NAME)" &PAUSE&EXIT

    保存快捷键为F5

    cmd是运行命令提示符(也就是Windows的终端,win7以后还有个powershell),使用/k传递要执行的命令

    cd "$(CURRENT_DIRECTORY)"是进入当前目录的意思,CURRENT_DIRECTORY是notepad++的一个内部变量,值是当前编辑文件的路径,为什么要进入文件当前路径呢,因为我们的py程序会用到相对路径,而cmd默认的启动路径是用户文件夹,如果不进到文件当前的路径,python程序使用的相对路径就会以用户文件夹作为标准进行运算,也就是"./test.jpg"这样的路径不会打开python文件同级下的test.jpg,而是打开用户路径(e.g.[例如,拉丁语,英文惯用法]C:\Users\Administrator)下的test.jpg导致文件没找到。"$(CURRENT_DIRECTORY)"表示变量部分是$(CURRENT_DIRECTORY),加双引号是为了防止路径有空格(e.g. cd "C:\Program Files" 可行,cd C:\Program Files不可行),&表示多条语句顺序执行,&&表示多条语句顺序执行但是前一个命令未通过则停止执行后面的命令,这个不举例子自行百度。

    PAUSE是终端的等待(i.e.[也就是,拉丁语,英文惯用法] 请按任意键继续. . .)防止出错的程序一闪而过,EXIT这个都知道了退出终端。

    5.使用notepad++的一些建议

    5.1由于python不认tab符所以设置成按tab间的制表符换为四个空格

    设置(主菜单里)-首选项-语言-替换为空格打上勾

    5.2如果不想这么做,也可以开启显示字符模式,查看tab和空格

    5.3如果对python不熟悉经常要查文档的可以将

    python -m pydoc -b

    写入notepad++快捷键,查阅文档用

    二、python的图片转文字

    1.图片转字符图(方法一)

    from PIL import Image,ImageDraw,ImageFont
    
    #因为这个需要不断调试,网上的算法千篇一律,出处https://blog.csdn.net/dpengwang/article/details/79076188
    ascii_char  =list("/\|()1{}$@B%8&WM#ZO0QLCJUYX*hkbdpqwmoahkbdpqwmzcvunxrjft[]?-_+~<>i!lI;:,\"^`'. ")
    imgname = "input.jpg" #需要处理的文件名
    zoom=10       #图片缩放大小,精细度,越小越精细
    fontsize=24    #文字大小
    backspace=3    #文字负间距,因为没有这个文字间距离太远
    #网上千篇一律的算法,也找不到出处了,可能是图像处理的一个算法
    def get_char(r,g,b,alpha= 256):
        length = len(ascii_char)
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        unitcount  = (256.0+1)/length
        return  ascii_char[int(gray/unitcount)]
    	
    img  = Image.open(imgname)#打开文件
    width=int(img.width/zoom)#缩放图片宽度
    height=int(img.height/zoom)#缩放图片高度
    img  = img.resize((width,height),Image.NEAREST)#进行缩放
    output = Image.new("RGB", (width*(fontsize-backspace), height*(fontsize-backspace)), (255, 255, 255))#新建空白画布
    drawBrush = ImageDraw.Draw(output)#绑定画刷
    font=ImageFont.truetype("simkai.ttf",fontsize)#定义字体
    
    #循环处理缩放后input的每一个像素
    for i in range(height):
        for j in range(width):
           drawBrush.text((j*(fontsize-backspace),i*(fontsize-backspace)), get_char(*img.getpixel((j,i))), (0,0,0),font=font)#在output画布上写字
    	   
    output.show()#使用默认工具打开图片
    output.save("output.jpg")#保存生成的图片到当前路径的output.jpg

    图片[input.jpg]

    notepadd++ F5运行(之前我们配置好的)输出[output.jpg]

    效果不怎么好,把zoom=3 就会很精细了,有待改进,总体的思路是计算RGB值,偏白色用较空的字符代替,偏黑用字符面积大的代替。程序框架有了,我们继续改进。

    1.1探索过程

    1.1.1先把ASCII码找出来

    #去掉一些意义符,只显示显示符
    for i in range(32, 127):
        print(chr(i),end="")

    F5运行

    1.1.2统计ASCII码的占黑比(我是这么叫的)

    我们还得知道这些字符的长宽是否统一

    from PIL import ImageFont
    fontsize=24 #字体大小
    font=ImageFont.truetype("simkai.ttf",fontsize)#定义字体
    for i in range(32, 127):
        print(chr(i),font.getsize(chr(i)))

    果然不统一,那么我们都按24来算吧

    from PIL import Image,ImageDraw,ImageFont
    fontsize=24#测试的字体大小
    font=ImageFont.truetype("simkai.ttf",fontsize)#定义字体
    canvas=Image.new("RGB", (fontsize,fontsize), (255, 255, 255))#用于实际作画统计
    ncanvas=Image.new("RGB", (fontsize,fontsize), (255, 255, 255))#空白画布用于重置股覆盖
    drawBrush = ImageDraw.Draw(canvas)#绑定画刷
    list=[]#存储用于排序的结果
    def statistics():
        for i in range(32, 127):#循环每个字符
            drawBrush.text((0,0),chr(i),(0,0,0),font)#花在画布上
            list.append([canvas.getcolors(255)[0][0],chr(i)])#获取所有的颜色统计,并输出白像素的个数
            canvas.paste(ncanvas)#清空画布
    statistics()#调用函数因为调试的时候要中断,break只能退出一个for循环,于是写成函数,return终止
    list.sort(reverse=True)#降序排序
    for i in list:
        print(i[1],end="")#不换行输出这个降序字符数组
    print()#换行

    1.1.3调试程序

    把这个字符串替换

    from PIL import Image,ImageDraw,ImageFont
    
    #因为这个需要不断调试,网上的算法千篇一律,出处https://blog.csdn.net/dpengwang/article/details/79076188
    ascii_char  =list("MWN@QB%G$&8#ROgDKCH5S0EmdUAX693PZ2qVb4ewahkpF*Yosy[]cJ7un?f{LTx|}t<z)>v(1j=\+!Il/ri~-^;\",:`'._ ")
    imgname = "input.jpg" #需要处理的文件名
    zoom=5      #图片缩放大小,精细度,越小越精细
    fontsize=24    #文字大小
    backspace=4    #文字负间距,因为没有这个文字间距离太远
    #网上千篇一律的算法,也找不到出处了,可能是图像处理的一个算法
    def get_char(r,g,b,alpha= 256):
        length = len(ascii_char)
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        unitcount  = (256.0+1)/length
        return  ascii_char[int(gray/unitcount)]
    	
    img  = Image.open(imgname)#打开文件
    width=int(img.width/zoom)#缩放图片宽度
    height=int(img.height/zoom)#缩放图片高度
    img  = img.resize((width,height),Image.NEAREST)#进行缩放
    output = Image.new("RGB", (width*(fontsize-backspace), height*(fontsize-backspace)), (255, 255, 255))#新建空白画布
    drawBrush = ImageDraw.Draw(output)#绑定画刷
    font=ImageFont.truetype("simkai.ttf",fontsize)#定义字体
    
    #循环处理缩放后input的每一个像素
    for i in range(height):
        for j in range(width):
           drawBrush.text((j*(fontsize-backspace),i*(fontsize-backspace)), get_char(*img.getpixel((j,i))), (0,0,0),font=font)#在output画布上写字
    	   
    output.show()#使用默认工具打开图片
    img.convert("1").save("temp.jpg")#暂存文件
    output.save("output.jpg")#保存生成的图片到当前路径的output.jpg

    1.1.4结果

    1.2其他

    这样的是先缩放后排的,还有一种是统计原图的,就是按照统计字符大小的区块的平均占黑比,然后使用字符代替,不过效果不怎么好

    from PIL import Image,ImageDraw,ImageFont
    import numpy
    
    #因为这个需要不断调试,网上的算法千篇一律,出处https://blog.csdn.net/dpengwang/article/details/79076188
    ascii_char  =list("MWN@QB%G$&8#ROgDKCH5S0EmdUAX693PZ2qVb4ewahkpF*Yosy[]cJ7un?f{LTx|}t<z)>v(1j=\+!Il/ri~-^;\",:`'._ ")
    imgname = "input.jpg" #需要处理的文件名
    fontsize=15      #几个像素缩成像素点 fontsize*fontsize为一个像素点为一个字符
    backspace=0    #文字负间距,因为没有这个文字间距离太远
    #网上千篇一律的算法,也找不到出处了,可能是图像处理的一个算法
    def get_char(r,g,b,alpha= 256):
        length = len(ascii_char)
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        unitcount  = (256.0+1)/length
        return  ascii_char[int(gray/unitcount)]
    img  = Image.open(imgname)#打开文件
    fontnumx=int(img.width/fontsize)#一行几个字符
    fontnumy=int(img.height/fontsize)#一列几个字符
    #img.convert("1").save("temp.jpg")#暂存文件二值化
    output = Image.new("RGB", (img.width-fontnumx*backspace,img.height-fontnumy*backspace), (255, 255, 255))#新建空白画布
    temp = Image.new("RGB", (fontnumx,fontnumy), (255, 255, 255))#新建空白画布,保存运行中间数据,用于调试
    drawBrush = ImageDraw.Draw(output)#绑定画刷
    font=ImageFont.truetype("simkai.ttf",fontsize)#定义字体
    
    #循环处理缩放后input的每一个像素
    for i in range(fontnumx):
        for j in range(fontnumy):
            #统计字符块区域的特征值
            rgb=numpy.array((0,0,0))
            for k in range(fontsize):
                for l in range(fontsize):
                    rgb+=numpy.array(img.getpixel((i*fontsize+k,j*fontsize+l)));
            rgb=(int(rgb[0]/fontsize/fontsize),int(rgb[1]/fontsize/fontsize),int(rgb[2]/fontsize/fontsize))
            temp.putpixel((i,j),rgb)#每个字符特征储存起来
            drawBrush.text((i*(fontsize-backspace),j*(fontsize-backspace)), get_char(*rgb), (0,0,0),font=font)#在output画布上写字
    temp.save("temp.jpg")
    output.show()#使用默认工具打开图片
    output.save("output.jpg")#保存生成的图片到当前路径的output.jpg

    2.图片转文字图(方法二)

    from PIL import Image,ImageDraw,ImageFont
    import numpy as np
    import matplotlib.pyplot as stage
    
    #增加pyplot的中文支持
    from pylab import *
    mpl.rcParams['font.sans-serif'] = ['FangSong'] 
    
    imgname = "input.jpg" #需要处理的文件名
    zoom=1#缩放大小
    fontsize=20      #几个像素缩成像素点 fontsize*fontsize为一个像素点为一个字符
    backspace=2    #文字负间距,因为没有这个文字间距离太远
    str="咖啡加两斤糖"
    
    img  = Image.open(imgname)#打开文件
    #加到舞台中
    stage.figure("图片转文字图",figsize=(15,8))#舞台名字
    stage.subplot(1,2,1),stage.title("原图"),stage.imshow(img)#显示原图到舞台
    outputx=int(img.width*zoom)#输出图像的大小
    outputy=int(img.height*zoom)
    fontnumx=int(outputx/(fontsize-backspace))+1#一行几个字符
    fontnumy=int(outputy/(fontsize-backspace))+1#一列几个字符
    img=img.resize((outputx,outputy),Image.NEAREST)#缩放
    output = Image.new("RGBA",(outputx,outputy), (0, 0, 0,0))#新建输出画布
    drawBrush = ImageDraw.Draw(output)#绑定画刷
    font=ImageFont.truetype("simkai.ttf",fontsize)#定义字体
    
    for i in range(fontnumx):
        for j in range(fontnumy):
            drawBrush.text((i*(fontsize-backspace),j*(fontsize-backspace)),str[i%len(str)], (255,255,255,255),font=font)#在output画布上写字
    output.paste(img,mask=output)#混合两张图片
    #使用矩阵快速替换颜色(0,0,0,0)白色,为(255,255,255,255)透明色
    data = np.array(output)#化为矩阵
    r,g,b,a=data.T#获取RGB值
    needreplace=(r == 0) & (g == 0) & (b == 0) & (a == 0)#取得交矩阵
    data[...][needreplace.T] = (0,0,0,0)#符合条件替换
    output =Image.fromarray(data)#读出数据
    
    stage.subplot(1,2,2),stage.title("输出"),stage.imshow(output)#显示处理结果到舞台
    stage.show(True)
    #output.show()#使用默认工具打开图片
    output.save("output.png")#保存生成的图片到当前路径的output.jpg

    很快发现了ImageDraw.Text方法不是打印的纯色导致合成颜色有损失,于是改进

    from PIL import Image,ImageDraw,ImageFont
    import numpy as np
    import matplotlib.pyplot as stage
    
    #增加pyplot的中文支持
    from pylab import *
    mpl.rcParams['font.sans-serif'] = ['FangSong'] 
    
    #Config配置
    imgname = "input.jpg" #需要处理的文件名
    zoom=1#缩放大小
    fontsize=20      #几个像素缩成像素点 fontsize*fontsize为一个像素点为一个字符
    fontweight=0     #这个没什么用(或者是我不知道具体用法,还是字体没有粗体)
    backspace=2    #文字负间距,因为没有这个文字间距离太远
    str="给我的咖啡来两斤糖"  #构成输出图片的字
    fontname="simkai.ttf"  #字体名称,在C://windows/fonts下
    isshow=True    #是否展示舞台
    
    img  = Image.open(imgname)#打开文件
    #加到舞台中
    if (isshow):
        stage.figure("图片转文字图",figsize=(15,8))#舞台名字
        stage.subplot(1,2,1),stage.title("原图"),stage.imshow(img)#显示原图到舞台
    outputx=int(img.width*zoom)#输出图像的大小
    outputy=int(img.height*zoom)
    fontnumx=int(outputx/(fontsize-backspace))+1#一行几个字符
    fontnumy=int(outputy/(fontsize-backspace))+1#一列几个字符
    img=img.resize((outputx,outputy),Image.NEAREST)#缩放
    output = Image.new("RGBA",(outputx,outputy), (0, 0, 0,0))#新建输出画布 000黑色 0全透明
    drawBrush = ImageDraw.Draw(output)#绑定画刷
    font=ImageFont.truetype(fontname,fontsize,index=fontweight)#定义字体
    
    for i in range(fontnumx):
        for j in range(fontnumy):
            drawBrush.text((i*(fontsize-backspace),j*(fontsize-backspace)),str[i%len(str)], (255,255,255,255),font=font)#在output画布上写字
    #因为text画的字不纯,我们还要二值化
    imgdata = np.array(img)#图片化为矩阵
    outdata = np.array(output)#输出化为矩阵
    r,g,b,a=outdata.T#获取rgba矩阵
    needreplace=(r != 0) & (g != 0) & (b != 0) & (a != 0)#进行条件矩阵运算
    imgdata=np.insert(imgdata,3,255,axis=2)#因为原来的图没有透明通道插个0当alpha
    outdata[...][needreplace.T] = imgdata[...][needreplace.T]#替换字体部分
    output =Image.fromarray(outdata)#写入输出图片
    if (isshow):
        stage.subplot(1,2,2),stage.title("输出"),stage.imshow(output)#显示处理结果到舞台
        stage.show(True)
    #output.show()#使用默认工具打开图片
    output.save("output.png")#保存生成的图片到当前路径的output.jpg

    3.Gif处理

    看着来吧。。反正读帧处理保存就行了

    展开全文
  • 包图

    热门讨论 2016-02-26 19:50:42
    一、概念了解  包是一种对模型元素进行成组织的通用机制,它把语义上相近... 包图是包与包之间的关系组成的,包图可以控制包中元素的可见性和描述包之间的依赖关系,因而可以统筹把握系统的结构。 二、基础知识 1.包

    一、概念了解

      是一种对模型元素进行成组织的通用机制,它把语义上相近的可能一起变更的模型元素组织在同一个包中,便于理解复杂的系统,控制系统结构各部分的接缝。只在软件开发过程中存在。

      包图是包与包之间的关系组成的,包图可以控制包中元素的可见性和描述包之间的依赖关系,因而可以统筹把握系统的结构。

    二、基础知识

    1.包的表示:

          用像文件夹一样的符号表示,大矩形左上角带一个小矩形。

    2.命名:

          包的名字要简单,具有描述性。可以用简单的字符串或路径名表示,可以放在大矩形中也可以放在左上角的小矩形框中。  

          包名下,可以用花括号中的约束说明包的性质,比如:{global}表示通用包,其他的包都依赖于该包。

          不同包的模型元素可以同名,但在同一个包中的模型元素不能同名。

    3.组成

          一个包可以拥有的元素:类、接口、组件、节点、协作、用例、图、其他包;一个包可以有一个或多个模型元素。

    4.包内元素的可视性:(与类的规则一致)

          ”+“,公共,对所有包是可视的

          ”-“,私有,对外包是不可视的

          ”#”,保护,只能对该包子包是可视的

    5.包的构造型

          <<facade>>:说明包仅仅是其他包的视图,只包含对另一个包所拥有的模型元素的引用,只作为另一个包的部分内容的公共视图。

          <<framework>>:说明包代表模型架构。

          <<stub>>:说明一个包是另一个包的公共内容的服务代理。

          <<subsystem>>:说明一个包代表系统模型的子系统

          <<system>>:一个包代表系统模型。

    三、包之间的关系

    依赖:两个包之间存在着依赖指一个元素的改变会引起另一个元素发生相应改变。

           表示:虚箭线表示,从依赖包指向独立包

           输入依赖:包与包之间的一种存取依赖关系,输入依赖是单向的,表示方法是在虚箭线上标有构造型<<import>>,存取依赖的另一个构造型是<<Access>>,他们的区别是<<import>>把目标包的内容加到源包的命名空间。


    泛化:表达事物的一般和特殊的关系 ,如果两个包之间有泛化关系,则特殊性包必须遵循一般性包的接口。一般性包加上{abstract}表示它定义了一个接口。也就是描述的继承关系。

    四、包图的作用

    1.可以描述需求:画完了用例图后可以将关联的用例放在一起,比如included, extending等放在包中,简化用例图,整理用户需求

    2.逻辑设计看起来更清晰:包类图,把一个框架的所有类放到相同的包中。相同继承层次的类放在相同的包中,彼此有聚合和组合关系的类放到一个包中,彼此合作频繁的类,通常放到一个包中,降低耦合度。

    3.限制访问:包可控制包内可视性

    五、小结

      包图是保持系统架构简明清晰的工具,包的出现,就是把一堆元素分类打包,包图就是把大的图进行重新组织,而包图的组织形式关系到系统性能,要遵循高内聚低耦合的原则。包图虽然不是正式的UML图,但是可以应用到任何UML图中去,作用还是很大的。

      

    展开全文
  • 计算机组成原理总结及知识网

    万次阅读 多人点赞 2021-01-19 23:52:03
    计算机组成原理知识摘要,个人复习整理,仅供参考
  • 由N×N个小方格组成的正方形中包含有多少个正方形
  • 在我研发的时候 用boothsocket 传送图片 每次传输500k 结果最后每次都不能组成图片 ,很容易丢 不清出是逻辑问题 还是什么问题 怎么解决
  • Android SDK安全码组成:SHA1+

    千次阅读 2016-11-05 10:46:54
    安全码的组成规则为:Android签名证书的sha1值+packagename例如:SHA1:BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75名:com.baidumap.demo Android签名证书的sha1值获取方式有两种
  • 菜鸟实战UML——包图

    千次阅读 2018-09-30 11:43:33
    包图 包图:是在UML中用类似于文件夹的符号表示的模型元素的组合。系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中。使用包图可以将相关元素归入一个系统。一个包中可包含附属包、图表或单个元素。 ...
  • 微信emoji表情图片包,包含一个文本对应表情的文件,方便做表情相关开发使用的资源。
  • UML之包图

    千次阅读 热门讨论 2016-12-03 11:36:15
    包图是任意一种UML图组成,但一般是UML用例图或类图。 包是一个UML结构,是用例或类等模型元件组织为组。简单来说,就是可以把一些类或用例放到一个包里,帮助我们把复杂的图模块化。 二、Why?(为什么要画包图...
  • UML——包图

    2015-10-10 10:41:51
    一个包图可以由任何一种UML图组成,通常是UML例图或UML类图,又是也被描述成文件夹。 创建包图的作用:逻辑上把一个复杂的图模块化,组织源代码。 图符 UML中用一个文件夹式的图符来表示包,每个包都有一个包名...
  • UML 之 包图

    千次阅读 多人点赞 2014-03-23 15:13:52
     包图可以是任何一种的UML图组成,通常是UML用例图或UML类图。 包是一个UML结构,它使得你能够把诸如用例或类之类模型元件组织为组。 包被描述成文件夹,可以应用在任何一种UML图上。   虽然包图并非是正式的UML...
  • 组织UML图—包图

    千次阅读 2016-05-23 09:23:26
    软件不可能只做一件很简单的事情,很自然的,在设计软件时,需要考虑的东西就很多,为了你的软件设计的各种UML图能够井然有序,推荐使用包图来组织你的UML图
  • 【UML入门教程】——构件图、部署图、包图

    千次阅读 热门讨论 2014-04-01 19:30:12
    包图就是把类组合成包。下面将对它们逐一介绍。 【构件图】  1.构件是什么? 构件是系统的一个物理的和可替代的组成部分,该组成部分遵循并实现了一组给定的接口。 2.构件的组织形式 1)通过包 2)...
  • UML--包图详解

    千次阅读 2019-10-24 10:34:53
    包图 在UML的建模机制中,模型的组织是通过包(Package)来实现的。包可以把所建立的各种模型(包括静态模型和动态模型)阻止起来,形成各种功能或用途的模块,并可以控制包中元素的可见性,以及描述包之间的依赖...
  • UML—包图

    千次阅读 热门讨论 2014-02-18 11:11:06
    包图是对一个软件系统的模块划分,使得源码结构更加清晰;类图是对一个软件系统静态部分的呈现,对象图是系统在某一时刻的展现。
  • UML逻辑视图-包图详解 UML统一建模语言入门.CSDN 文章目录UML逻辑视图-包图详解包管理类确定包的关系生成Java代码建立类图关系生成框架代码 包是一个容器,提供对UML元素进行分组的功能,主要表现在:把一个大的系统...
  • 【总结】UML图的小九九——包图

    热门讨论 2015-12-09 19:17:48
    因为包图并不是正式的UML图,但却可以由任何一种的UML图组成,通常是UML用例图或UML类图。既然有用例图和类图等图,为什么还要再来个小九九呢?这就要看包图的作用了——它不仅仅是长的像文件夹,在功能上起到了...
  • UML图详解(九)包图

    万次阅读 多人点赞 2016-06-17 15:47:20
    维护和控制系统总体结构的重要建模工具; 方便理解和处理整个模型; 设计良好的是高内聚、低耦合的,并对其内容的访问具有严密的控制;
  • 根据组成分为四种类型,分别是、帧首SOF(Start of Frame)、命令(Token)、数据包(Data)、握手包(Handshake),如下(大家一定要把PID类型和包类型分开)。 4种PID类型和4种类型的区别如下...
  • Java安全组成

    千次阅读 2019-07-27 18:36:27
    Java安全组成:JCA(Java机密体系结构 Java Cryptography Architecture)JCE(Java 加密扩展 Java Cryptography Extension)JSSE(Java 安全套接字扩展 Java Secure Sockets Extension)JAAS(Java鉴别与安全...
  • Qt通过UDP传图片,实现自定义分包和组

    万次阅读 多人点赞 2016-09-27 16:35:16
    数据由包头和包体组成,包头用于标记每数据的特征,体是图片根据指定大小分出的每段数据,这里指定大小为const int UDP_MAX_SIZE=1200。 为何要分包可参考:TCP、UDP数据包大小的限制 二.分包与组 1.分包...
  • UML之包图(Package Diagram)

    千次阅读 2018-05-19 21:32:56
    一个”包图”可以是任何一种的UML图组成,通常是UML用例图或UML类图。 包是一个UML结构,它使得你能够把诸如用例或类之类模型元件组织为组。 包可以理解为文件夹。 应用对象 可行性分析,概要设计。 作用 既然包...
  • 发现个好东西思维导图, 最近开始用MindManager整理博客. 一. 静态图概述 1. 图的分类-静态图 图的分类 : 图分为结构行为图 和动态行为图, 结构...静态图概念 : 类图, 对象图, 包图是静态图; 静态图显示系统的静态
  • UML建模(七)包图

    2014-03-24 14:58:21
    包图由包和包之间的关系组成。 1.2 包 包提供了一种用于组织各种元素的分组机制。在UML中,包用来对元素进行分组,并为这些元素提供了命名空间。包所拥有的或引用的所有元素称为包的内容,包没有实例。 图1 ...
  • 一张看懂嵌入式系统组成

    千次阅读 2019-10-15 15:43:43
    一个嵌入式系统装置一般都由嵌入式计算机系统和执行装置组成,下是我对嵌入式系统组成的总结(缩略),嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。执行装置也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 848,695
精华内容 339,478
热门标签
关键字:

包图的组成