<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>知行小屋</title>
  
  <subtitle>追求简洁，顺其自然</subtitle>
  <link href="https://blog.natuie.net/atom.xml" rel="self"/>
  
  <link href="https://blog.natuie.net/"/>
  <updated>2025-08-16T15:24:59.575Z</updated>
  <id>https://blog.natuie.net/</id>
  
  <author>
    <name>Natuie</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Vim终极快捷键指南</title>
    <link href="https://blog.natuie.net/posts/2025/07/04/134356/"/>
    <id>https://blog.natuie.net/posts/2025/07/04/134356/</id>
    <published>2025-07-04T05:43:56.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h1 id="🚀-Vim终极快捷键指南：高效编辑的艺术"><a href="#🚀-Vim终极快捷键指南：高效编辑的艺术" class="headerlink" title="🚀 Vim终极快捷键指南：高效编辑的艺术"></a>🚀 Vim终极快捷键指南：高效编辑的艺术</h1><h2 id="常用"><a href="#常用" class="headerlink" title="常用"></a>常用</h2><table><thead><tr><th>快捷键</th><th>功能描述</th><th>使用频率</th></tr></thead><tbody><tr><td><code>i</code></td><td>进入插入模式</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td><code>ESC</code></td><td>返回普通模式</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td><code>:w</code></td><td>保存文件</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td><code>:q</code></td><td>退出编辑器</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td><code>u</code></td><td>撤销操作</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td><code>Ctrl+r</code></td><td>重做操作</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td><code>dd</code></td><td>删除整行</td><td>⭐⭐⭐⭐</td></tr><tr><td><code>yy</code></td><td>复制整行</td><td>⭐⭐⭐⭐</td></tr><tr><td><code>p</code></td><td>粘贴</td><td>⭐⭐⭐⭐</td></tr><tr><td><code>/搜索词</code></td><td>全局搜索</td><td>⭐⭐⭐⭐</td></tr><tr><td><code>n</code></td><td>跳转到下一个搜索结果</td><td>⭐⭐⭐⭐</td></tr><tr><td><code>:sp</code></td><td>水平分割窗口</td><td>⭐⭐⭐</td></tr><tr><td><code>:vsp</code></td><td>垂直分割窗口</td><td>⭐⭐⭐</td></tr><tr><td><code>Ctrl+ww</code></td><td>切换窗口</td><td>⭐⭐⭐</td></tr></tbody></table><h2 id="🔑-模式切换"><a href="#🔑-模式切换" class="headerlink" title="🔑 模式切换"></a>🔑 模式切换</h2><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>i</code></td><td>进入插入模式</td></tr><tr><td><code>a</code></td><td>在光标后插入</td></tr><tr><td><code>o</code></td><td>下方新建行插入</td></tr><tr><td><code>ESC</code></td><td>返回普通模式</td></tr><tr><td><code>v</code></td><td>进入可视模式</td></tr><tr><td><code>V</code></td><td>行可视模式</td></tr><tr><td><code>Ctrl+v</code></td><td>块可视模式</td></tr><tr><td><code>:</code></td><td>进入命令模式</td></tr></tbody></table><h2 id="🏃-光标移动"><a href="#🏃-光标移动" class="headerlink" title="🏃 光标移动"></a>🏃 光标移动</h2><h3 id="基础移动"><a href="#基础移动" class="headerlink" title="基础移动"></a>基础移动</h3><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>h</code> <code>j</code> <code>k</code> <code>l</code></td><td>左&#x2F;下&#x2F;上&#x2F;右移动</td></tr><tr><td><code>w</code></td><td>跳到下一个单词开头</td></tr><tr><td><code>b</code></td><td>跳到上一个单词开头</td></tr><tr><td><code>e</code></td><td>跳到单词末尾</td></tr><tr><td><code>0</code></td><td>跳到行首</td></tr><tr><td><code>^</code></td><td>跳到行首非空字符</td></tr><tr><td><code>$</code></td><td>跳到行尾</td></tr><tr><td><code>gg</code></td><td>跳到文件开头</td></tr><tr><td><code>G</code></td><td>跳到文件末尾</td></tr><tr><td><code>50G</code></td><td>跳转到第50行</td></tr></tbody></table><h3 id="高级跳跃"><a href="#高级跳跃" class="headerlink" title="高级跳跃"></a>高级跳跃</h3><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>Ctrl+o</code></td><td>返回上一个位置</td></tr><tr><td><code>Ctrl+i</code></td><td>前进到下一个位置</td></tr><tr><td><code>%</code></td><td>在匹配的括号间跳转</td></tr><tr><td><code>*</code></td><td>跳转到下一个相同单词</td></tr><tr><td><code>#</code></td><td>跳转到上一个相同单词</td></tr><tr><td><code>gd</code></td><td>跳转到定义</td></tr></tbody></table><h2 id="✂️-文本编辑"><a href="#✂️-文本编辑" class="headerlink" title="✂️ 文本编辑"></a>✂️ 文本编辑</h2><h3 id="删除操作"><a href="#删除操作" class="headerlink" title="删除操作"></a>删除操作</h3><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>x</code></td><td>删除当前字符</td></tr><tr><td><code>dw</code></td><td>删除至单词末尾</td></tr><tr><td><code>dd</code></td><td>删除整行</td></tr><tr><td><code>D</code></td><td>删除至行尾</td></tr><tr><td><code>dt&quot;</code></td><td>删除直到引号处</td></tr><tr><td><code>d5d</code></td><td>删除5行</td></tr></tbody></table><h3 id="复制粘贴"><a href="#复制粘贴" class="headerlink" title="复制粘贴"></a>复制粘贴</h3><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>yy</code></td><td>复制整行</td></tr><tr><td><code>yw</code></td><td>复制单词</td></tr><tr><td><code>p</code></td><td>在光标后粘贴</td></tr><tr><td><code>P</code></td><td>在光标前粘贴</td></tr><tr><td><code>&quot;ayy</code></td><td>复制到寄存器a</td></tr></tbody></table><h3 id="撤销重做"><a href="#撤销重做" class="headerlink" title="撤销重做"></a>撤销重做</h3><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>u</code></td><td><strong>撤销</strong>上一次操作</td></tr><tr><td><code>Ctrl+r</code></td><td><strong>重做</strong>被撤销的操作</td></tr><tr><td><code>U</code></td><td><strong>整行撤销</strong>（还原当前行所有修改）</td></tr><tr><td><code>:undolist</code></td><td>查看撤销历史</td></tr><tr><td><code>:earlier 10m</code></td><td>回到10分钟前的状态</td></tr><tr><td><code>:later 5</code></td><td>前进5个变更状态</td></tr><tr><td><code>:undo 5</code></td><td>撤销到历史树中第5个分支</td></tr><tr><td><code>g+</code></td><td>时间线向前移动</td></tr><tr><td><code>g-</code></td><td>时间线向后移动</td></tr></tbody></table><h3 id="其他编辑"><a href="#其他编辑" class="headerlink" title="其他编辑"></a>其他编辑</h3><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>guu</code></td><td>当前行<strong>全转小写</strong></td></tr><tr><td><code>gUU</code></td><td>当前行<strong>全转大写</strong></td></tr><tr><td><code>g~</code></td><td>反转选区大小写</td></tr><tr><td><code>:m.+1</code></td><td>将当前行下移一行</td></tr><tr><td><code>.</code></td><td>重复上次编辑操作</td></tr></tbody></table><h2 id="🎯-选择操作（可视模式）"><a href="#🎯-选择操作（可视模式）" class="headerlink" title="🎯 选择操作（可视模式）"></a>🎯 选择操作（可视模式）</h2><h3 id="进入选择模式"><a href="#进入选择模式" class="headerlink" title="进入选择模式"></a>进入选择模式</h3><table><thead><tr><th>快捷键</th><th>选择范围</th></tr></thead><tbody><tr><td><code>v</code></td><td><strong>字符级选择</strong></td></tr><tr><td><code>V</code></td><td><strong>行级选择</strong></td></tr><tr><td><code>Ctrl+v</code></td><td><strong>块状选择</strong>（列选择）</td></tr><tr><td><code>gv</code></td><td>重新选择上次选区</td></tr></tbody></table><h3 id="文本对象选择"><a href="#文本对象选择" class="headerlink" title="文本对象选择"></a>文本对象选择</h3><table><thead><tr><th>组合键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>vaw</code></td><td>选择当前单词（含空格）</td></tr><tr><td><code>viw</code></td><td>选择当前单词（不含空格）</td></tr><tr><td><code>vab</code></td><td>选择圆括号块 <code>(content)</code></td></tr><tr><td><code>vaB</code></td><td>选择花括号块 <code>&#123;content&#125;</code></td></tr><tr><td><code>vit</code></td><td>选择XML标签内容 <code>&lt;tag&gt;内容&lt;/tag&gt;</code></td></tr><tr><td><code>Vap</code></td><td>选择整个段落</td></tr><tr><td><code>vi&#39;</code></td><td>选择单引号内容</td></tr><tr><td><code>vi&quot;</code></td><td>选择双引号内容</td></tr></tbody></table><h3 id="选区操作命令"><a href="#选区操作命令" class="headerlink" title="选区操作命令"></a>选区操作命令</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># 在选区后直接输入操作命令：</span><br><span class="line">d    # 删除选区</span><br><span class="line"><span class="keyword">y</span>    # 复制选区</span><br><span class="line"><span class="keyword">c</span>    # 修改选区（删除并进入插入模式）</span><br><span class="line">&gt;    # 向右缩进</span><br><span class="line">&lt;    # 向左缩进</span><br><span class="line">=    # 自动缩进</span><br><span class="line">~    # 大小写转换</span><br><span class="line"><span class="keyword">u</span>    # 转为小写（仅选区）</span><br><span class="line">U    # 转为大写（仅选区）</span><br></pre></td></tr></table></figure><h2 id="🔍-搜索替换"><a href="#🔍-搜索替换" class="headerlink" title="🔍 搜索替换"></a>🔍 搜索替换</h2><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>/word</code></td><td>向前搜索word</td></tr><tr><td><code>?word</code></td><td>向后搜索word</td></tr><tr><td><code>n</code></td><td>下一个匹配项</td></tr><tr><td><code>N</code></td><td>上一个匹配项</td></tr><tr><td><code>:%s/old/new/g</code></td><td>全局替换</td></tr><tr><td><code>:%s/old/new/gc</code></td><td>带确认的全局替换</td></tr><tr><td><code>:s/old/new/</code></td><td>当前行替换</td></tr><tr><td><code>:s/old/new/g</code></td><td>当前行全部替换</td></tr></tbody></table><h2 id="🪟-窗口管理"><a href="#🪟-窗口管理" class="headerlink" title="🪟 窗口管理"></a>🪟 窗口管理</h2><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>:sp</code></td><td>水平分割窗口</td></tr><tr><td><code>:vsp</code></td><td>垂直分割窗口</td></tr><tr><td><code>Ctrl+w w</code></td><td>切换窗口</td></tr><tr><td><code>Ctrl+w h/j/k/l</code></td><td>向左&#x2F;下&#x2F;上&#x2F;右切换窗口</td></tr><tr><td><code>Ctrl+w +</code></td><td>增加窗口高度</td></tr><tr><td><code>Ctrl+w -</code></td><td>减少窗口高度</td></tr><tr><td><code>Ctrl+w q</code></td><td>关闭当前窗口</td></tr><tr><td><code>Ctrl+w r</code></td><td>旋转窗口位置</td></tr><tr><td><code>Ctrl+w T</code></td><td>将窗口拆分为新标签页</td></tr><tr><td><code>gt</code> &#x2F; <code>gT</code></td><td>切换到下一个&#x2F;上一个标签页</td></tr></tbody></table><h2 id="📚-高效技巧"><a href="#📚-高效技巧" class="headerlink" title="📚 高效技巧"></a>📚 高效技巧</h2><h3 id="宏录制"><a href="#宏录制" class="headerlink" title="宏录制"></a>宏录制</h3><ol><li><code>qa</code> - 开始录制宏到寄存器a</li><li>执行操作序列</li><li><code>q</code> - 停止录制</li><li><code>@a</code> - 执行宏</li><li><code>5@a</code> - 重复执行5次</li></ol><h3 id="文本对象操作"><a href="#文本对象操作" class="headerlink" title="文本对象操作"></a>文本对象操作</h3><table><thead><tr><th>快捷键</th><th>功能描述</th></tr></thead><tbody><tr><td><code>ciw</code></td><td>更改当前单词</td></tr><tr><td><code>ci&quot;</code></td><td>更改引号内内容</td></tr><tr><td><code>da&#39;</code></td><td>删除单引号及其内容</td></tr><tr><td><code>yip</code></td><td>复制整个段落</td></tr><tr><td><code>&gt;iB</code></td><td>缩进当前代码块</td></tr><tr><td><code>=ap</code></td><td>自动格式化段落</td></tr></tbody></table><h3 id="批量操作"><a href="#批量操作" class="headerlink" title="批量操作"></a>批量操作</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span>. Ctrl+v 进入块选择模式</span><br><span class="line"><span class="number">2</span>. 选择多行区域</span><br><span class="line"><span class="number">3</span>. Shift+i 输入内容</span><br><span class="line"><span class="number">4</span>. ESC 应用到所有行</span><br></pre></td></tr></table></figure><h2 id="🔄-撤销-选择联合应用案例"><a href="#🔄-撤销-选择联合应用案例" class="headerlink" title="🔄 撤销+选择联合应用案例"></a>🔄 撤销+选择联合应用案例</h2><ol><li><p><strong>错误删除恢复</strong>  </p><ul><li>误删文本 → 按 <code>u</code> 撤销</li><li>发现撤销过头 → 按 <code>Ctrl+r</code> 重做</li></ul></li><li><p><strong>选区批量修改</strong>  </p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Ctrl+v  # 进入块选择</span><br><span class="line">jjj     # 向下选<span class="number">3</span>行</span><br><span class="line">I       # 块插入</span><br><span class="line">//      # 输入注释符</span><br><span class="line">ESC     # 三行同时添加<span class="string">&quot;//&quot;</span></span><br><span class="line"><span class="keyword">u</span>       # 若出错立即撤销</span><br></pre></td></tr></table></figure></li><li><p><strong>复杂回退</strong>  </p><ul><li>修改了30行代码后发现问题</li><li><code>:undolist</code> 查看历史节点</li><li><code>:undo 2</code> 回到第2个历史状态</li></ul></li><li><p><strong>选区撤销技巧</strong>  </p><ul><li>选择多行按 <code>=</code> 自动缩进</li><li>结果不理想 → 保持选区状态按 <code>u</code><br>（仅撤销选区内的操作！）</li></ul></li></ol><h2 id="🌟-高级组合技"><a href="#🌟-高级组合技" class="headerlink" title="🌟 高级组合技"></a>🌟 高级组合技</h2><ol><li><strong>快速注释</strong>：<code>Ctrl+v</code> → 选择行 → <code>I</code> → <code>#</code> → <code>ESC</code></li><li><strong>多行缩进</strong>：<code>V</code> → 选择行 → <code>&gt;</code> &#x2F; <code>&lt;</code></li><li><strong>重复操作</strong>：<code>.</code> (重复上次编辑操作)</li><li><strong>文件内查找</strong>：<code>gd</code> (跳转到定义)</li><li><strong>打开文件</strong>：<code>:e path/to/file</code></li><li><strong>标签导航</strong>：<code>Ctrl+^</code> 切换最近两个文件</li></ol><blockquote><p>💡 提示：在命令模式输入 <code>:help key-notation</code> 查看完整快捷键文档</p></blockquote>]]></content>
    
    
    <summary type="html">本指南系统整理了Vim编辑器的终极快捷键，涵盖常用操作、模式切换、光标移动、文本编辑、选择操作、搜索替换、窗口管理等核心功能，包含高效技巧和高级组合操作案例，帮助开发者提升编辑效率。</summary>
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Vim, 快捷键, 编辑器, 效率工具" scheme="https://blog.natuie.net/tags/Vim-%E5%BF%AB%E6%8D%B7%E9%94%AE-%E7%BC%96%E8%BE%91%E5%99%A8-%E6%95%88%E7%8E%87%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>Windows刷新环境变量与设置环境变量</title>
    <link href="https://blog.natuie.net/posts/2025/05/04/221832/"/>
    <id>https://blog.natuie.net/posts/2025/05/04/221832/</id>
    <published>2025-05-04T14:18:32.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h3 id="刷新环境变量"><a href="#刷新环境变量" class="headerlink" title="刷新环境变量"></a>刷新环境变量</h3><p>很多情况刚刚改了环境变量但是又不想重启该软件，使用一下方法刷新环境变量：</p><p>CMD：</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">:: 刷新用户变量</span><br><span class="line"><span class="built_in">set</span> <span class="built_in">PATH</span>=<span class="variable">%USERPROFILE%</span>\AppData\Local\Microsoft\WindowsApps;<span class="variable">%PATH%</span></span><br><span class="line">:: 刷新系统变量（需要管理员权限）</span><br><span class="line"><span class="built_in">set</span> <span class="built_in">PATH</span>=<span class="variable">%SystemRoot%</span>\system32;<span class="variable">%PATH%</span></span><br></pre></td></tr></table></figure><p>PowerShell：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 刷新用户变量和系统变量</span></span><br><span class="line"><span class="variable">$env:Path</span> = [<span class="type">System.Environment</span>]::GetEnvironmentVariable(<span class="string">&quot;Path&quot;</span>,<span class="string">&quot;User&quot;</span>) + <span class="string">&quot;;&quot;</span> + [<span class="type">System.Environment</span>]::GetEnvironmentVariable(<span class="string">&quot;Path&quot;</span>,<span class="string">&quot;Machine&quot;</span>)</span><br></pre></td></tr></table></figure><p>如何在命令行设置变量？以下是几种常用的方法：</p><h3 id="临时设置环境变量"><a href="#临时设置环境变量" class="headerlink" title="临时设置环境变量"></a>临时设置环境变量</h3><p>在命令提示符（cmd）中，您可以使用以下命令来临时设置环境变量。这些变量在关闭命令提示符窗口后就会失效。</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> 变量名=变量值</span><br></pre></td></tr></table></figure><p>例如，设置一个名为<code>MY_VARIABLE</code>的环境变量，值为<code>Hello</code>：</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> MY_VARIABLE=Hello</span><br></pre></td></tr></table></figure><p>您可以通过以下命令来查看变量值：</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="variable">%MY_VARIABLE%</span></span><br></pre></td></tr></table></figure><h3 id="永久设置环境变量"><a href="#永久设置环境变量" class="headerlink" title="永久设置环境变量"></a>永久设置环境变量</h3><p>要永久设置环境变量，您需要将其添加到系统的环境变量列表中。可以通过以下命令：</p><ul><li>对于当前用户：<figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">setx 变量名 &quot;变量值&quot;</span><br></pre></td></tr></table></figure></li><li>对于所有用户（需要管理员权限）：<figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">setx 变量名 &quot;变量值&quot; /M</span><br></pre></td></tr></table></figure>请注意，使用<code>setx</code>设置的变量不会立即生效，它们将在新的命令提示符窗口中生效。</li></ul><h3 id="在PowerShell中设置环境变量"><a href="#在PowerShell中设置环境变量" class="headerlink" title="在PowerShell中设置环境变量"></a>在PowerShell中设置环境变量</h3><p>在PowerShell中，您可以使用以下命令来设置环境变量：</p><ul><li>临时设置：<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$env:</span>变量名=<span class="string">&quot;变量值&quot;</span></span><br></pre></td></tr></table></figure></li><li>永久设置当前用户的环境变量：<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="type">Environment</span>]::SetEnvironmentVariable(<span class="string">&quot;变量名&quot;</span>, <span class="string">&quot;变量值&quot;</span>, [<span class="type">EnvironmentVariableTarget</span>]::User)</span><br></pre></td></tr></table></figure></li><li>永久设置所有用户的环境变量（需要管理员权限）：<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="type">Environment</span>]::SetEnvironmentVariable(<span class="string">&quot;变量名&quot;</span>, <span class="string">&quot;变量值&quot;</span>, [<span class="type">EnvironmentVariableTarget</span>]::Machine)</span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    
    <summary type="html">还在为Windows环境变量烦恼吗？看看如何刷新环境变量和设置环境变量吧！</summary>
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Windows" scheme="https://blog.natuie.net/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>Github Actions 超详细教程，看这一篇就够了！</title>
    <link href="https://blog.natuie.net/posts/2025/02/06/055518/"/>
    <id>https://blog.natuie.net/posts/2025/02/06/055518/</id>
    <published>2025-02-05T21:55:18.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-GitHub-Actions-的基本概念"><a href="#1-GitHub-Actions-的基本概念" class="headerlink" title="1 GitHub Actions 的基本概念"></a>1 GitHub Actions 的基本概念</h2><ul><li><p>在 GitHub Actions 中，工作流（workflow）由多个任务（job）组成，每个任务包含一系列步骤（step）。核心概念如下：</p></li><li><p>Workflow（工作流）：定义自动化流程的 YAML 配置文件，存放在 .github&#x2F;workflows&#x2F; 目录下。</p></li><li><p>Job（任务）：一个完整的执行单元，可以包含多个步骤。</p></li><li><p>Step（步骤）：任务中的具体执行操作，比如拉取代码、安装依赖、运行脚本等。</p></li><li><p>Runner（运行器）：执行 GitHub Actions 任务的服务器，分为 GitHub 提供的托管 runner 和自托管 runner。</p></li><li><p>Event（触发事件）：定义何时运行工作流，例如 push、pull_request、schedule（定时任务）等。</p></li></ul><h2 id="2-解释"><a href="#2-解释" class="headerlink" title="2 解释"></a>2 解释</h2><p>工作流文件件存在于你的仓库.github&#x2F;workflows目录下的*.yml</p><h3 id="2-1-示例代码"><a href="#2-1-示例代码" class="headerlink" title="2.1 示例代码"></a>2.1 示例代码</h3><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="attr">name:</span> <span class="string">CI</span> <span class="string">Workflow</span>  <span class="comment"># 工作流名称</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span> </span><br><span class="line">  <span class="attr">push:</span>            <span class="comment"># 触发条件：当代码被推送到仓库时触发</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span>       <span class="comment"># 仅当推送到 main 分支时触发</span></span><br><span class="line">  <span class="attr">pull_request:</span>    <span class="comment"># 触发条件：当有 PR 时触发</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span>            <span class="comment"># 定义一个名为 &quot;test&quot; 的任务</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span>  <span class="comment"># 运行环境，使用 GitHub 提供的 Ubuntu 最新版本</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">Code</span>   <span class="comment"># 第一步：拉取代码</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node.js</span>    <span class="comment"># 第二步：设置 Node.js 环境</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="number">18</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Dependencies</span>  <span class="comment"># 第三步：安装项目依赖</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">install</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">Tests</span>  <span class="comment"># 第四步：执行测试</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">test</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-触发条件"><a href="#3-触发条件" class="headerlink" title="3 触发条件"></a>3 触发条件</h2><table><thead><tr><th>触发方式</th><th>说明</th></tr></thead><tbody><tr><td><code>push</code></td><td>代码推送时触发</td></tr><tr><td><code>pull_request</code></td><td>PR 相关操作时触发</td></tr><tr><td><code>workflow_dispatch</code></td><td>手动触发</td></tr><tr><td><code>schedule</code></td><td>定时运行</td></tr><tr><td><code>repository_dispatch</code></td><td>通过 Webhook 触发</td></tr><tr><td><code>workflow_call</code></td><td>允许其他工作流调用</td></tr></tbody></table><h3 id="3-1-push（推送触发）"><a href="#3-1-push（推送触发）" class="headerlink" title="3.1 push（推送触发）"></a>3.1 push（推送触发）</h3><ul><li>示例 1：所有推送都会触发<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span> <span class="string">push</span></span><br></pre></td></tr></table></figure>表示任何 git push 操作都会触发工作流。</li><li>示例 2：指定分支触发<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">dev</span></span><br></pre></td></tr></table></figure>只有当代码推送到 main 或 dev 分支时才会触发。</li><li>示例 3：指定路径触发<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">paths:</span></span><br><span class="line">      <span class="string">-&#x27;src/**&#x27;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;!src/ignore-file.txt&#x27;</span></span><br></pre></td></tr></table></figure>只有 src&#x2F; 目录下的文件变更时才会触发，但 src&#x2F;ignore-file.txt 为例外。</li></ul><h3 id="3-2-pull-request（拉取请求触发）"><a href="#3-2-pull-request（拉取请求触发）" class="headerlink" title="3.2 pull_request（拉取请求触发）"></a>3.2 pull_request（拉取请求触发）</h3><ul><li>示例 1：默认触发<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span> <span class="string">pull_request</span></span><br></pre></td></tr></table></figure>表示在所有分支上的 PR 操作（opened、synchronize、reopened）都会触发。</li><li>示例 2：指定分支触发<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br></pre></td></tr></table></figure>仅当 PR 目标分支是 main 时触发。</li><li>示例 3：指定 PR 事件触发<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">    <span class="attr">types:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">opened</span>      <span class="comment"># PR 创建时触发</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">synchronize</span> <span class="comment"># PR 更新时触发（新提交）</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">reopened</span>    <span class="comment"># 重新打开 PR 时触发</span></span><br></pre></td></tr></table></figure>可以选择特定 PR 事件来触发工作流。</li></ul><h3 id="3-3-workflow-dispatch（手动触发）"><a href="#3-3-workflow-dispatch（手动触发）" class="headerlink" title="3.3 workflow_dispatch（手动触发）"></a>3.3 workflow_dispatch（手动触发）</h3><ul><li>示例 1：支持手动触发<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br></pre></td></tr></table></figure>添加此配置后，可以在 GitHub “Actions” 页面手动运行工作流。</li><li>示例 2：手动触发并传入参数<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line">    <span class="attr">inputs:</span></span><br><span class="line">      <span class="attr">environment:</span></span><br><span class="line">        <span class="attr">description:</span> <span class="string">&quot;选择运行环境&quot;</span></span><br><span class="line">        <span class="attr">required:</span> <span class="literal">true</span></span><br><span class="line">        <span class="attr">default:</span> <span class="string">&quot;production&quot;</span></span><br><span class="line">        <span class="attr">type:</span> <span class="string">choice</span></span><br><span class="line">        <span class="attr">options:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="string">development</span></span><br><span class="line">          <span class="bullet">-</span> <span class="string">staging</span></span><br><span class="line">          <span class="bullet">-</span> <span class="string">production</span></span><br></pre></td></tr></table></figure>触发时可以选择 development、staging 或 production 作为运行环境。</li></ul><h3 id="3-4-schedule（定时任务触发）"><a href="#3-4-schedule（定时任务触发）" class="headerlink" title="3.4 schedule（定时任务触发）"></a>3.4 schedule（定时任务触发）</h3><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="code">   cron语法</span></span><br><span class="line">┌───────── 分钟（0 - 59）</span><br><span class="line">│ ┌────────── 小时（0 - 23）</span><br><span class="line">│ │ ┌─────────── 日期（1 - 31）</span><br><span class="line">│ │ │ ┌──────────── 月份（1 - 12）</span><br><span class="line">│ │ │ │ ┌───────────── 星期（0 - 7，0 和 7 都代表星期天）</span><br><span class="line">│ │ │ │ │</span><br><span class="line"><span class="bullet">*  </span>*  *  *  * </span><br></pre></td></tr></table></figure><ul><li>示例 1：每天凌晨 12 点运行<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">&#x27;0 0 * * *&#x27;</span></span><br></pre></td></tr></table></figure>GitHub Actions 服务器使用 UTC 时间，如果需要北京时间（UTC+8），需要调整为 cron: ‘0 16 * * *’。</li><li>示例 2：每 6 小时运行一次<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">&#x27;0 */6 * * *&#x27;</span></span><br></pre></td></tr></table></figure></li><li>示例 3：每周一上午 8 点运行<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">&#x27;0 8 * * 1&#x27;</span></span><br></pre></td></tr></table></figure>表示每周一（1 代表周一）北京时间 8:00 运行。</li></ul><h3 id="3-5-repository-dispatch（Webhook-事件触发）"><a href="#3-5-repository-dispatch（Webhook-事件触发）" class="headerlink" title="3.5 repository_dispatch（Webhook 事件触发）"></a>3.5 repository_dispatch（Webhook 事件触发）</h3><ul><li>示例：监听外部 Webhook 事件<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">repository_dispatch:</span></span><br><span class="line">    <span class="attr">types:</span> [<span class="string">custom-event</span>]</span><br></pre></td></tr></table></figure>然后使用 GitHub API 触发：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST -H <span class="string">&quot;Authorization: token YOUR_GITHUB_TOKEN&quot;</span> \</span><br><span class="line">     -H <span class="string">&quot;Accept: application/vnd.github.v3+json&quot;</span> \</span><br><span class="line">     <span class="string">&quot;https://api.github.com/repos/USERNAME/REPO/dispatches&quot;</span> \</span><br><span class="line">     -d <span class="string">&#x27;&#123;&#123;&quot;event_type&quot;: &quot;custom-event&quot;&#125;&#125;&#x27;</span></span><br></pre></td></tr></table></figure>这样，你可以从外部应用（如 Jenkins、GitLab CI）触发 GitHub Actions。</li></ul><h3 id="3-6-workflow-call（被其他工作流调用）"><a href="#3-6-workflow-call（被其他工作流调用）" class="headerlink" title="3.6 workflow_call（被其他工作流调用）"></a>3.6 workflow_call（被其他工作流调用）</h3><ul><li>示例：定义可复用的工作流<br>在 reusable-workflow.yml 文件中：<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">workflow_call:</span></span><br></pre></td></tr></table></figure>在另一个工作流中调用：<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">call-reusable-workflow:</span></span><br><span class="line">    <span class="attr">uses:</span> <span class="string">user/repo/.github/workflows/reusable-workflow.yml@main</span></span><br></pre></td></tr></table></figure>这样就可以实现工作流复用。</li></ul><h3 id="3-7-push-和-pull-request-组合触发"><a href="#3-7-push-和-pull-request-组合触发" class="headerlink" title="3.7 push 和 pull_request 组合触发"></a>3.7 push 和 pull_request 组合触发</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br></pre></td></tr></table></figure><p>这样，当推送到 main 分支或 PR 目标分支为 main 时，工作流都会执行。</p><h3 id="3-8-多种触发方式结合"><a href="#3-8-多种触发方式结合" class="headerlink" title="3.8 多种触发方式结合"></a>3.8 多种触发方式结合</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">&#x27;0 16 * * *&#x27;</span></span><br></pre></td></tr></table></figure><p>这表示：</p><ul><li>当代码推送到 main 分支时触发</li><li>当 PR 目标分支为 main 时触发</li><li>可以手动触发</li><li>每天 UTC 时间 16:00 触发（对应北京时间 00:00）</li></ul><h2 id="4-Job的结构"><a href="#4-Job的结构" class="headerlink" title="4 Job的结构"></a>4 Job的结构</h2><h3 id="4-1-Job-的完整结构"><a href="#4-1-Job-的完整结构" class="headerlink" title="4.1 Job 的完整结构"></a>4.1 Job 的完整结构</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job_name:</span>             <span class="comment"># 任务 ID（唯一标识）</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">任务名称</span>       <span class="comment"># 任务的可读名称（可选）</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">运行环境</span>   <span class="comment"># 任务运行的环境</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">依赖任务</span>     <span class="comment"># 当前任务需要等待哪些任务完成（可选）</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">条件判断</span>        <span class="comment"># 任务是否执行的条件（可选）</span></span><br><span class="line">    <span class="attr">outputs:</span>            <span class="comment"># 任务的输出变量（可选）</span></span><br><span class="line">      <span class="attr">key:</span> <span class="string">value</span></span><br><span class="line">    <span class="attr">strategy:</span>           <span class="comment"># 并行或矩阵策略（可选）</span></span><br><span class="line">      <span class="attr">matrix:</span> <span class="string">...</span></span><br><span class="line">    <span class="attr">steps:</span>              <span class="comment"># 任务中的执行步骤</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">步骤名称</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">步骤</span> <span class="string">ID</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">使用</span> <span class="string">GitHub</span> <span class="string">组件</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">执行</span> <span class="string">Shell</span> <span class="string">命令</span></span><br><span class="line">        <span class="attr">with:</span> <span class="string">组件的参数</span></span><br><span class="line">        <span class="attr">env:</span> <span class="string">设定环境变量</span></span><br></pre></td></tr></table></figure><hr><h3 id="4-2-Job-各字段详细说明"><a href="#4-2-Job-各字段详细说明" class="headerlink" title="4.2 Job 各字段详细说明"></a>4.2 Job 各字段详细说明</h3><h4 id="4-2-1-job-name（任务-ID）"><a href="#4-2-1-job-name（任务-ID）" class="headerlink" title="4.2.1 job_name（任务 ID）"></a>4.2.1 job_name（任务 ID）</h4><p><code>job_name</code>是 GitHub Actions 内部唯一标识该任务的 ID，不能重复。</p><p>• 只能使用小写字母、数字、<code>-</code>或<code>_</code>。</p><p>• 不能有空格。</p><p>• 这个 ID 可用于依赖（<code>needs</code>）、输出变量（<code>outputs</code>）。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build_project:</span>   <span class="comment"># 任务 ID</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行 build_project&quot;</span></span><br></pre></td></tr></table></figure><hr><h4 id="4-2-2-name（任务名称）"><a href="#4-2-2-name（任务名称）" class="headerlink" title="4.2.2 name（任务名称）"></a>4.2.2 name（任务名称）</h4><p><code>name</code>是任务的可读名称，它会在 GitHub Actions 界面中显示。</p><p>• 可以包含空格、大小写、特殊字符。</p><p>• 不影响 ID，完全是为了可读性。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">📦</span> <span class="string">构建项目</span>  <span class="comment"># 任务名称</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行 Build 任务&quot;</span></span><br></pre></td></tr></table></figure><p>👉GitHub Actions 界面会显示📦构建项目，但 job ID 仍然是<code>build</code>。</p><hr><h4 id="4-2-3-runs-on（运行环境）"><a href="#4-2-3-runs-on（运行环境）" class="headerlink" title="4.2.3 runs-on（运行环境）"></a>4.2.3 runs-on（运行环境）</h4><p>指定 job 运行在哪个操作系统或环境上。可以选择：</p><p>• GitHub 托管环境：</p><p>• <code>ubuntu-latest</code>（默认）</p><p>• <code>windows-latest</code></p><p>• <code>macos-latest</code></p><p>• 指定特定版本：</p><p>• <code>ubuntu-20.04</code></p><p>• <code>windows-2022</code></p><p>• 自定义 Runner：</p><p>• <code>self-hosted</code></p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-22.04</span>  <span class="comment"># 在 Ubuntu 22.04 运行</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行测试&quot;</span></span><br></pre></td></tr></table></figure><hr><h4 id="4-2-4-needs（依赖任务）"><a href="#4-2-4-needs（依赖任务）" class="headerlink" title="4.2.4 needs（依赖任务）"></a>4.2.4 needs（依赖任务）</h4><p>用于让 job 依赖其他 job 的执行结果，必须等前置 job 成功后才运行。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job1:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Job 1 完成&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">job2:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">job1</span>  <span class="comment"># 只有 job1 成功后才会运行</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Job 2 开始&quot;</span></span><br></pre></td></tr></table></figure><p>• <code>job1</code>先执行。</p><p>• <code>job2</code>依赖<code>job1</code>，等<code>job1</code>成功后才会运行。</p><hr><h4 id="4-2-5-if（条件判断）"><a href="#4-2-5-if（条件判断）" class="headerlink" title="4.2.5 if（条件判断）"></a>4.2.5 if（条件判断）</h4><p>用于控制 job 是否执行，可以结合状态检查、分支、标签等条件。</p><p>示例 1：仅在 main 分支执行</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">github.ref</span> <span class="string">==</span> <span class="string">&#x27;refs/heads/main&#x27;</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;仅在 main 分支执行&quot;</span></span><br></pre></td></tr></table></figure><p>示例 2：只有 job1 成功时运行</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job1:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">exit</span> <span class="number">0</span>  <span class="comment"># 成功</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">job2:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">job1</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">success()</span>  <span class="comment"># 只有 job1 成功才执行</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Job 1 成功，继续执行 Job 2&quot;</span></span><br></pre></td></tr></table></figure><p>👉其他<code>if</code>关键字：</p><p>• <code>success()</code>：前置 job 成功时执行。</p><p>• <code>failure()</code>：前置 job 失败时执行。</p><p>• <code>always()</code>：无论前置 job 成功或失败都会执行。</p><hr><h4 id="4-2-6-outputs（任务输出）"><a href="#4-2-6-outputs（任务输出）" class="headerlink" title="4.2.6 outputs（任务输出）"></a>4.2.6 outputs（任务输出）</h4><p>用于让当前 job 生成的值被其他 job 读取。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job1:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">outputs:</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">$&#123;&#123;</span> <span class="string">steps.step1.outputs.result</span> <span class="string">&#125;&#125;</span>  <span class="comment"># 任务的输出</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">step1</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;result=hello world&quot;</span> <span class="string">&gt;&gt;</span> <span class="string">$GITHUB_ENV</span>  <span class="comment"># 生成变量</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">job2:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">job1</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Job 1 的输出是 $<span class="template-variable">&#123;&#123; needs.job1.outputs.message &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>• <code>job1</code>生成<code>message=&quot;hello world&quot;</code>。</p><p>• <code>job2</code>读取<code>job1</code>的<code>outputs</code>并打印。</p><hr><h4 id="4-2-7-strategy（并行策略）"><a href="#4-2-7-strategy（并行策略）" class="headerlink" title="4.2.7 strategy（并行策略）"></a>4.2.7 strategy（并行策略）</h4><p><code>strategy.matrix</code>可以让 job 在多个环境下同时运行，适用于不同版本测试。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">node-version:</span> [<span class="number">14</span>, <span class="number">16</span>, <span class="number">18</span>]  <span class="comment"># 在 3 个 Node.js 版本上运行</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.node-version</span> <span class="string">&#125;&#125;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;测试 Node.js 版本 $<span class="template-variable">&#123;&#123; matrix.node-version &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉执行结果：GitHub Actions 会自动创建 3 个任务，分别在 Node.js 14、16 和 18 运行。</p><hr><h4 id="4-2-8-steps（任务的执行步骤）"><a href="#4-2-8-steps（任务的执行步骤）" class="headerlink" title="4.2.8 steps（任务的执行步骤）"></a>4.2.8 steps（任务的执行步骤）</h4><p><code>steps</code>是 job 内部的执行单元，每个 step 运行一个命令或 GitHub 组件。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">my_job:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">拉取代码</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">运行</span> <span class="string">Shell</span> <span class="string">命令</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Hello World!&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">设置环境变量</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">MY_VAR:</span> <span class="string">&quot;test&quot;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;环境变量是 $MY_VAR&quot;</span></span><br></pre></td></tr></table></figure><p>👉<code>steps</code>关键字段：</p><p>• <code>name</code>：步骤名称（可选）。</p><p>• <code>uses</code>：使用 GitHub 官方组件。</p><p>• <code>run</code>：执行 Shell 命令。</p><p>• <code>env</code>：设置环境变量。</p><p>• <code>with</code>：传递参数给<code>uses</code>。</p><hr><h2 id="5-Runs-on相关"><a href="#5-Runs-on相关" class="headerlink" title="5 Runs-on相关"></a>5 Runs-on相关</h2><h3 id="5-1-runs-on语法结构"><a href="#5-1-runs-on语法结构" class="headerlink" title="5.1 runs-on语法结构"></a>5.1 <code>runs-on</code>语法结构</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job_name:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">运行环境</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Hello World!&quot;</span></span><br></pre></td></tr></table></figure><p><code>runs-on</code>指定任务运行的操作系统。可选值包括：<code>ubuntu-latest</code>、<code>windows-latest</code>、<code>macos-latest</code>等。</p><hr><h3 id="5-2-GitHub-托管-Runner"><a href="#5-2-GitHub-托管-Runner" class="headerlink" title="5.2 GitHub 托管 Runner"></a>5.2 GitHub 托管 Runner</h3><p>GitHub 提供的虚拟机运行 job，无需配置服务器。支持三种操作系统：</p><p> 操作系统     关键字              <br> Ubuntu（默认）  <code>ubuntu-latest</code>    <br> Windows      <code>windows-latest</code>   <br> macOS        <code>macos-latest</code>     </p><h4 id="5-2-1-Ubuntu"><a href="#5-2-1-Ubuntu" class="headerlink" title="5.2.1 Ubuntu"></a>5.2.1 Ubuntu</h4><p>Ubuntu 是默认 Runner，启动最快，支持最多工具。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br></pre></td></tr></table></figure><p>可选版本：</p><p>• <code>ubuntu-22.04</code></p><p>• <code>ubuntu-20.04</code>（推荐）</p><p>• <code>ubuntu-18.04</code>（即将废弃）</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-20.04</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行 Ubuntu 20.04&quot;</span></span><br></pre></td></tr></table></figure><h4 id="5-2-2-Windows"><a href="#5-2-2-Windows" class="headerlink" title="5.2.2 Windows"></a>5.2.2 Windows</h4><p>适用于 Windows 相关的构建和测试。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">runs-on:</span> <span class="string">windows-latest</span></span><br></pre></td></tr></table></figure><p>可选版本：</p><p>• <code>windows-2022</code></p><p>• <code>windows-2019</code>（推荐）</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">windows-2019</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Windows 任务&quot;</span></span><br></pre></td></tr></table></figure><h4 id="5-2-3-macOS"><a href="#5-2-3-macOS" class="headerlink" title="5.2.3 macOS"></a>5.2.3 macOS</h4><p>适用于 macOS&#x2F;iOS 开发，如 Xcode、Swift。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">runs-on:</span> <span class="string">macos-latest</span></span><br></pre></td></tr></table></figure><p>可选版本：</p><p>• <code>macos-14</code></p><p>• <code>macos-13</code></p><p>• <code>macos-12</code>（推荐）</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">macos-12</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Mac 任务&quot;</span></span><br></pre></td></tr></table></figure><hr><h4 id="5-2-4-自托管-Runner"><a href="#5-2-4-自托管-Runner" class="headerlink" title="5.2.4 自托管 Runner"></a>5.2.4 自托管 Runner</h4><p>如果官方 Runner 不满足需求（如 ARM 设备、私有服务器），可以自建 Runner。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">runs-on:</span> <span class="string">self-hosted</span></span><br></pre></td></tr></table></figure><p>可以加标签：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">runs-on:</span> [<span class="string">self-hosted</span>, <span class="string">linux</span>, <span class="string">arm64</span>]</span><br></pre></td></tr></table></figure><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">my_job:</span></span><br><span class="line">    <span class="attr">runs-on:</span> [<span class="string">self-hosted</span>, <span class="string">ubuntu</span>, <span class="string">gpu</span>]</span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;自托管 Runner&quot;</span></span><br></pre></td></tr></table></figure><p>👉适用场景：</p><p>• 运行 ARM 设备（如树莓派）</p><p>• 需要访问私有网络资源</p><p>• 需要更强的硬件性能</p><hr><h3 id="5-3-组合多个runs-on"><a href="#5-3-组合多个runs-on" class="headerlink" title="5.3 组合多个runs-on"></a>5.3 组合多个runs-on</h3><h4 id="5-3-1-标签实现多个runs-on"><a href="#5-3-1-标签实现多个runs-on" class="headerlink" title="5.3.1 标签实现多个runs-on"></a>5.3.1 标签实现多个<code>runs-on</code></h4><p>可以同时指定多个标签，让 job 运行在符合所有条件的 Runner 上。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">runs-on:</span> [<span class="string">self-hosted</span>, <span class="string">ubuntu</span>, <span class="string">docker</span>]</span><br></pre></td></tr></table></figure><p>仅在自托管且 Ubuntu 并支持 Docker 的 Runner 上执行。</p><hr><h4 id="5-3-2-runs-on动态选择（矩阵matrix）"><a href="#5-3-2-runs-on动态选择（矩阵matrix）" class="headerlink" title="5.3.2 runs-on动态选择（矩阵matrix）"></a>5.3.2 <code>runs-on</code>动态选择（矩阵<code>matrix</code>）</h4><p>可以使用矩阵<code>strategy.matrix</code>在不同环境同时运行 job。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>, <span class="string">macos-latest</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行在 $<span class="template-variable">&#123;&#123; matrix.os &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉这个 job 会自动运行 3 次，分别在：</p><ol><li><p><code>ubuntu-latest</code></p></li><li><p><code>windows-latest</code></p></li><li><p><code>macos-latest</code></p></li></ol><hr><h3 id="5-4-runs-on的完整示例"><a href="#5-4-runs-on的完整示例" class="headerlink" title="5.4 runs-on的完整示例"></a>5.4 <code>runs-on</code>的完整示例</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job1:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行在 Ubuntu&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">job2:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">windows-2019</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行在 Windows&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">job3:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">macos-12</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行在 macOS&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">job4:</span></span><br><span class="line">    <span class="attr">runs-on:</span> [<span class="string">self-hosted</span>, <span class="string">gpu</span>]</span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;运行在自托管 GPU 服务器&quot;</span></span><br></pre></td></tr></table></figure><h2 id="6-steps"><a href="#6-steps" class="headerlink" title="6 steps"></a>6 steps</h2><h3 id="6-1-steps语法结构"><a href="#6-1-steps语法结构" class="headerlink" title="6.1 steps语法结构"></a>6.1 <code>steps</code>语法结构</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job_name:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">步骤名称（可选）</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">步骤</span> <span class="string">ID（可选）</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">GitHub</span> <span class="string">组件（可选）</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">执行</span> <span class="string">Shell</span> <span class="string">命令（可选）</span></span><br><span class="line">        <span class="attr">with:</span> <span class="string">传递参数（仅用于</span> <span class="string">`uses`）</span></span><br><span class="line">        <span class="attr">env:</span> <span class="string">设定环境变量（可选）</span></span><br><span class="line">        <span class="attr">if:</span> <span class="string">条件判断（可选）</span></span><br></pre></td></tr></table></figure><p>• <code>name</code>：步骤名称，在 GitHub Actions UI 显示。</p><p>• <code>id</code>：步骤唯一标识，用于引用该步骤的输出。</p><p>• <code>uses</code>：使用 GitHub 官方&#x2F;社区组件。</p><p>• <code>run</code>：执行 Shell 命令（如果不使用<code>uses</code>）。</p><p>• <code>with</code>：传递参数给<code>uses</code>。</p><p>• <code>env</code>：环境变量。</p><p>• <code>if</code>：设置步骤执行条件。</p><hr><h3 id="6-2-steps关键字段解析"><a href="#6-2-steps关键字段解析" class="headerlink" title="6.2 steps关键字段解析"></a>6.2 <code>steps</code>关键字段解析</h3><h4 id="6-2-1-name（步骤名称）"><a href="#6-2-1-name（步骤名称）" class="headerlink" title="6.2.1 name（步骤名称）"></a>6.2.1 <code>name</code>（步骤名称）</h4><p><code>name</code>是 GitHub Actions UI 中的步骤名称，用于标记当前步骤的作用。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">🚀</span> <span class="string">运行</span> <span class="string">Shell</span> <span class="string">命令</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Hello, GitHub Actions!&quot;</span></span><br></pre></td></tr></table></figure><p>👉运行效果：</p><figure class="highlight autohotkey"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">🚀 运行 Shell 命令</span><br><span class="line"><span class="built_in">Hello,</span> GitHub Actions!</span><br></pre></td></tr></table></figure><p>❗注意：<code>name</code>只是 UI 显示，不影响步骤执行。</p><hr><h4 id="6-2-2-id（步骤-ID）"><a href="#6-2-2-id（步骤-ID）" class="headerlink" title="6.2.2 id（步骤 ID）"></a>6.2.2 <code>id</code>（步骤 ID）</h4><p><code>id</code>用于在当前<code>job</code>内唯一标识某个步骤，可以让后续步骤读取它的输出。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">计算时间</span></span><br><span class="line">    <span class="attr">id:</span> <span class="string">time_step</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;time=$(date +%s)&quot;</span> <span class="string">&gt;&gt;</span> <span class="string">$GITHUB_ENV</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取时间</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;时间戳是 $<span class="template-variable">&#123;&#123; env.time &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉解析：</p><p>• <code>id: time_step</code>标记该步骤。</p><p>• <code>echo &quot;time=$(date +%s)&quot; &gt;&gt; $GITHUB_ENV</code>保存输出变量。</p><p>• <code>run: echo &quot;时间戳是 $&#123;&#123; env.time &#125;&#125;&quot;</code>读取前一个步骤的变量。</p><hr><h4 id="6-2-3-uses（使用-GitHub-组件）"><a href="#6-2-3-uses（使用-GitHub-组件）" class="headerlink" title="6.2.3 uses（使用 GitHub 组件）"></a>6.2.3 <code>uses</code>（使用 GitHub 组件）</h4><p>GitHub Actions 允许直接使用社区组件，避免重复造轮子。</p><p>组件来源：</p><p>• GitHub 官方：<code>actions/checkout@v4</code></p><p>• 第三方社区：<code>actions/setup-node@v4</code></p><p>示例 1：使用<code>checkout</code>组件拉取代码</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">拉取代码</span></span><br><span class="line">    <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br></pre></td></tr></table></figure><p>示例 2：使用<code>setup-node</code>组件安装 Node.js</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Node.js</span> <span class="number">16</span></span><br><span class="line">    <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">    <span class="attr">with:</span></span><br><span class="line">      <span class="attr">node-version:</span> <span class="number">16</span></span><br></pre></td></tr></table></figure><p>👉解析：</p><p>• <code>uses: actions/setup-node@v4</code>使用官方<code>setup-node</code>组件。</p><p>• <code>with.node-version: 16</code>安装 Node.js 16。</p><hr><h4 id="6-2-4-run（运行-Shell-命令）"><a href="#6-2-4-run（运行-Shell-命令）" class="headerlink" title="6.2.4 run（运行 Shell 命令）"></a>6.2.4 <code>run</code>（运行 Shell 命令）</h4><p><code>run</code>直接执行 Shell 命令，支持 Linux（Bash）、Windows（PowerShell）。</p><p>示例 1：单行命令</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">运行</span> <span class="string">Bash</span> <span class="string">命令</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Hello, GitHub Actions!&quot;</span></span><br></pre></td></tr></table></figure><p>示例 2：多行命令</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">多行</span> <span class="string">Shell</span> <span class="string">命令</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">      echo &quot;第一行&quot;</span></span><br><span class="line"><span class="string">      echo &quot;第二行&quot;</span></span><br><span class="line"><span class="string">      echo &quot;第三行&quot;</span></span><br></pre></td></tr></table></figure><p>示例 3：Windows 执行 PowerShell</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">运行</span> <span class="string">PowerShell</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">Write-Output</span> <span class="string">&quot;Hello, Windows!&quot;</span></span><br><span class="line">    <span class="attr">shell:</span> <span class="string">pwsh</span></span><br></pre></td></tr></table></figure><hr><h4 id="6-2-5-with（传递参数）"><a href="#6-2-5-with（传递参数）" class="headerlink" title="6.2.5 with（传递参数）"></a>6.2.5 <code>with</code>（传递参数）</h4><p>用于给<code>uses</code>组件传递参数，不同的组件<code>with</code>参数不同。</p><p>示例 1：使用<code>setup-node</code>安装 Node.js</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">使用</span> <span class="string">`setup-node`</span> <span class="string">安装</span> <span class="string">Node.js</span></span><br><span class="line">    <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">    <span class="attr">with:</span></span><br><span class="line">      <span class="attr">node-version:</span> <span class="number">18</span></span><br></pre></td></tr></table></figure><p>👉解析：</p><p>• <code>with.node-version: 18</code>指定安装 Node.js 18。</p><p>示例 2：上传文件</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">上传文件</span></span><br><span class="line">    <span class="attr">uses:</span> <span class="string">actions/upload-artifact@v3</span></span><br><span class="line">    <span class="attr">with:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">my-artifact</span></span><br><span class="line">      <span class="attr">path:</span> <span class="string">./output</span></span><br></pre></td></tr></table></figure><p>• <code>with.name</code>指定上传的文件名称。</p><p>• <code>with.path</code>指定上传的文件夹路径。</p><hr><h4 id="6-2-6-env（环境变量）"><a href="#6-2-6-env（环境变量）" class="headerlink" title="6.2.6 env（环境变量）"></a>6.2.6 <code>env</code>（环境变量）</h4><p>用于设置步骤的环境变量，可以让<code>run</code>读取。</p><p>示例 1：自定义环境变量</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">设置环境变量</span></span><br><span class="line">    <span class="attr">env:</span></span><br><span class="line">      <span class="attr">GREETING:</span> <span class="string">&quot;Hello&quot;</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$GREETING, GitHub Actions!&quot;</span></span><br></pre></td></tr></table></figure><p>👉解析：</p><p>• <code>env.GREETING: &quot;Hello&quot;</code>定义变量。</p><p>• <code>echo &quot;$GREETING, GitHub Actions!&quot;</code>使用变量。</p><p>示例 2：使用 GitHub 内置环境变量</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">显示</span> <span class="string">GitHub</span> <span class="string">仓库信息</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;当前仓库：$<span class="template-variable">&#123;&#123; github.repository &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>GitHub 提供了内置变量，如：</p><p>• <code>$&#123;&#123; github.repository &#125;&#125;</code>：当前仓库名。</p><p>• <code>$&#123;&#123; github.ref &#125;&#125;</code>：当前分支。</p><p>• <code>$&#123;&#123; github.actor &#125;&#125;</code>：触发者。</p><hr><h4 id="6-2-7-if（条件执行）"><a href="#6-2-7-if（条件执行）" class="headerlink" title="6.2.7 if（条件执行）"></a>6.2.7 <code>if</code>（条件执行）</h4><p><code>if</code>用于控制步骤是否执行，支持：</p><p>• 成功时执行：<code>if: success()</code></p><p>• 失败时执行：<code>if: failure()</code></p><p>• 始终执行：<code>if: always()</code></p><p>• 按分支执行：<code>if: github.ref == &#39;refs/heads/main&#39;</code></p><p>示例 1：仅在 main 分支执行</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">仅在</span> <span class="string">main</span> <span class="string">分支执行</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">github.ref</span> <span class="string">==</span> <span class="string">&#x27;refs/heads/main&#x27;</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;当前是 main 分支&quot;</span></span><br></pre></td></tr></table></figure><p>示例 2：前面步骤失败时执行</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">运行失败的命令</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">exit</span> <span class="number">1</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">失败时运行</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">failure()</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;上一步失败了！&quot;</span></span><br></pre></td></tr></table></figure><hr><h4 id="6-3-steps组合示例"><a href="#6-3-steps组合示例" class="headerlink" title="6.3 steps组合示例"></a>6.3 <code>steps</code>组合示例</h4><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">my_job:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">拉取代码</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">设置环境变量</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">MY_VAR:</span> <span class="string">&quot;Hello&quot;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$MY_VAR, GitHub Actions!&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="number">18</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">运行</span> <span class="string">npm</span> <span class="string">脚本</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">仅在</span> <span class="string">main</span> <span class="string">分支执行部署</span></span><br><span class="line">        <span class="attr">if:</span> <span class="string">github.ref</span> <span class="string">==</span> <span class="string">&#x27;refs/heads/main&#x27;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;部署到生产环境&quot;</span></span><br></pre></td></tr></table></figure><hr><p>GitHub Actions 中的<code>strategy</code>详解</p><p><code>strategy</code>用于控制<code>job</code>的执行方式，可以用于：</p><p>• 并行执行多个任务（矩阵<code>matrix</code>）</p><p>• 重试失败的任务（<code>fail-fast</code>和<code>max-parallel</code>）</p><hr><h2 id="7-strategy相关"><a href="#7-strategy相关" class="headerlink" title="7 strategy相关"></a>7 strategy相关</h2><h3 id="7-1-strategy语法结构"><a href="#7-1-strategy语法结构" class="headerlink" title="7.1 strategy语法结构"></a>7.1 <code>strategy</code>语法结构</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job_name:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span> <span class="comment"># 定义矩阵</span></span><br><span class="line">        <span class="string">变量名称:</span> [<span class="string">值1</span>, <span class="string">值2</span>, <span class="string">值3</span>]</span><br><span class="line">      <span class="attr">fail-fast:</span> <span class="literal">true</span>  <span class="comment"># 其中一个失败，全部取消</span></span><br><span class="line">      <span class="attr">max-parallel:</span> <span class="number">2</span>  <span class="comment"># 最多同时运行 2 个任务</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Hello World&quot;</span></span><br></pre></td></tr></table></figure><hr><h3 id="7-2-matrix（矩阵构建）"><a href="#7-2-matrix（矩阵构建）" class="headerlink" title="7.2 matrix（矩阵构建）"></a>7.2 <code>matrix</code>（矩阵构建）</h3><p><code>matrix</code>允许并行运行多个<code>job</code>，每个<code>job</code>使用不同的参数组合。</p><p>示例 1：在不同操作系统运行</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>, <span class="string">macos-latest</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;当前系统是 $<span class="template-variable">&#123;&#123; matrix.os &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉这个<code>job</code>会自动运行 3 次：</p><ol><li><p><code>ubuntu-latest</code></p></li><li><p><code>windows-latest</code></p></li><li><p><code>macos-latest</code></p></li></ol><p>示例 2：在不同 Node.js 版本运行</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">node:</span> [<span class="number">14</span>, <span class="number">16</span>, <span class="number">18</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">设置</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.node</span> <span class="string">&#125;&#125;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">node</span> <span class="string">-v</span></span><br></pre></td></tr></table></figure><p>👉这个<code>job</code>会运行 3 次：</p><p>• 使用 Node.js 14</p><p>• 使用 Node.js 16</p><p>• 使用 Node.js 18</p><hr><h3 id="7-3-组合多个matrix变量"><a href="#7-3-组合多个matrix变量" class="headerlink" title="7.3 组合多个matrix变量"></a>7.3 组合多个<code>matrix</code>变量</h3><p>可以组合多个变量，GitHub Actions 会自动生成所有可能的组合。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>]</span><br><span class="line">        <span class="attr">node:</span> [<span class="number">14</span>, <span class="number">16</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;系统: $<span class="template-variable">&#123;&#123; matrix.os &#125;&#125;</span>, Node.js 版本: $<span class="template-variable">&#123;&#123; matrix.node &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉自动生成 4 组<code>job</code>：</p><table><thead><tr><th>os</th><th>node</th></tr></thead><tbody><tr><td>ubuntu-latest</td><td>14</td></tr><tr><td>ubuntu-latest</td><td>16</td></tr><tr><td>windows-latest</td><td>14</td></tr><tr><td>windows-latest</td><td>16</td></tr></tbody></table><hr><h3 id="7-4-exclude（排除某些组合）"><a href="#7-4-exclude（排除某些组合）" class="headerlink" title="7.4 exclude（排除某些组合）"></a>7.4 <code>exclude</code>（排除某些组合）</h3><p>有时不需要所有组合，可以排除一些组合。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>]</span><br><span class="line">        <span class="attr">node:</span> [<span class="number">14</span>, <span class="number">16</span>]</span><br><span class="line">      <span class="attr">exclude:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">os:</span> <span class="string">windows-latest</span></span><br><span class="line">          <span class="attr">node:</span> <span class="number">14</span>  <span class="comment"># 排除 Windows + Node 14</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;系统: $<span class="template-variable">&#123;&#123; matrix.os &#125;&#125;</span>, Node.js 版本: $<span class="template-variable">&#123;&#123; matrix.node &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉只运行 3 组<code>job</code>：</p><table><thead><tr><th>os</th><th>node</th></tr></thead><tbody><tr><td>ubuntu-latest</td><td>14</td></tr><tr><td>ubuntu-latest</td><td>16</td></tr><tr><td>windows-latest</td><td>16</td></tr></tbody></table><hr><h3 id="7-5-include（添加额外组合）"><a href="#7-5-include（添加额外组合）" class="headerlink" title="7.5 include（添加额外组合）"></a>7.5 <code>include</code>（添加额外组合）</h3><p>可以手动添加额外的<code>matrix</code>组合。</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>]</span><br><span class="line">        <span class="attr">node:</span> [<span class="number">14</span>, <span class="number">16</span>]</span><br><span class="line">      <span class="attr">include:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">os:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">          <span class="attr">node:</span> <span class="number">18</span>  <span class="comment"># 额外增加 Ubuntu + Node 18</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;系统: $<span class="template-variable">&#123;&#123; matrix.os &#125;&#125;</span>, Node.js 版本: $<span class="template-variable">&#123;&#123; matrix.node &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉生成 5 组<code>job</code>：</p><table><thead><tr><th>os</th><th>node</th></tr></thead><tbody><tr><td>ubuntu-latest</td><td>14</td></tr><tr><td>ubuntu-latest</td><td>16</td></tr><tr><td>ubuntu-latest</td><td>18</td></tr><tr><td>windows-latest</td><td>14</td></tr><tr><td>windows-latest</td><td>16</td></tr></tbody></table><hr><h3 id="7-6-fail-fast（任务失败时是否取消）"><a href="#7-6-fail-fast（任务失败时是否取消）" class="headerlink" title="7.6 fail-fast（任务失败时是否取消）"></a>7.6 <code>fail-fast</code>（任务失败时是否取消）</h3><p><code>fail-fast: true</code>（默认）：如果有一个<code>job</code>失败，取消所有剩余任务</p><p><code>fail-fast: false</code>：即使有任务失败，其他<code>job</code>仍然运行</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">fail-fast:</span> <span class="literal">false</span>  <span class="comment"># 允许所有任务运行完</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">exit</span> <span class="number">1</span>  <span class="comment"># 故意让任务失败</span></span><br></pre></td></tr></table></figure><p>👉<code>fail-fast: false</code>时，失败的任务不影响其他任务。</p><hr><h3 id="7-7-max-parallel（最大并行任务数）"><a href="#7-7-max-parallel（最大并行任务数）" class="headerlink" title="7.7 max-parallel（最大并行任务数）"></a>7.7 <code>max-parallel</code>（最大并行任务数）</h3><p>默认：GitHub Actions 会并行执行所有<code>matrix</code>任务</p><p>可以限制最大并行任务数</p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">max-parallel:</span> <span class="number">2</span>  <span class="comment"># 同时最多运行 2 个任务</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>, <span class="string">macos-latest</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;当前系统: $<span class="template-variable">&#123;&#123; matrix.os &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>👉3 个任务会最多 2 个同时运行，1 个等待。</p><hr><h3 id="7-8-strategy组合示例"><a href="#7-8-strategy组合示例" class="headerlink" title="7.8 strategy组合示例"></a>7.8 <code>strategy</code>组合示例</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>]</span><br><span class="line">        <span class="attr">node:</span> [<span class="number">14</span>, <span class="number">16</span>, <span class="number">18</span>]</span><br><span class="line">      <span class="attr">exclude:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">os:</span> <span class="string">windows-latest</span></span><br><span class="line">          <span class="attr">node:</span> <span class="number">14</span>  <span class="comment"># 排除 Windows + Node 14</span></span><br><span class="line">      <span class="attr">include:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">os:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">          <span class="attr">node:</span> <span class="number">20</span>  <span class="comment"># 额外增加 Ubuntu + Node 20</span></span><br><span class="line">      <span class="attr">fail-fast:</span> <span class="literal">false</span>  <span class="comment"># 任务失败时继续执行</span></span><br><span class="line">      <span class="attr">max-parallel:</span> <span class="number">2</span>  <span class="comment"># 最多同时运行 2 个任务</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.node</span> <span class="string">&#125;&#125;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">node</span> <span class="string">-v</span></span><br></pre></td></tr></table></figure><p>👉执行的任务：</p><table><thead><tr><th>os</th><th>node</th></tr></thead><tbody><tr><td>ubuntu-latest</td><td>14</td></tr><tr><td>ubuntu-latest</td><td>16</td></tr><tr><td>ubuntu-latest</td><td>18</td></tr><tr><td>ubuntu-latest</td><td>20</td></tr><tr><td>windows-latest</td><td>16</td></tr><tr><td>windows-latest</td><td>18</td></tr></tbody></table><hr><h2 id="8-env-变量"><a href="#8-env-变量" class="headerlink" title="8 env 变量"></a>8 env 变量</h2><h3 id="8-1-env变量的三种作用域"><a href="#8-1-env变量的三种作用域" class="headerlink" title="8.1 env变量的三种作用域"></a>8.1 <code>env</code>变量的三种作用域</h3><p><code>env</code>变量可以在以下三种层级定义：</p><ol><li><p>工作流级别（workflow）：适用于整个<code>.yml</code>文件</p></li><li><p>任务级别（job）：适用于 job 内所有 steps</p></li><li><p>步骤级别（step）：仅适用于单个 step</p></li></ol><h3 id="8-2-env语法结构"><a href="#8-2-env语法结构" class="headerlink" title="8.2 env语法结构"></a>8.2 <code>env</code>语法结构</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">示例工作流</span></span><br><span class="line"><span class="attr">on:</span> <span class="string">push</span></span><br><span class="line"></span><br><span class="line"><span class="attr">env:</span> <span class="comment"># ✅ 工作流级变量（全局）</span></span><br><span class="line">  <span class="attr">GLOBAL_VAR:</span> <span class="string">&quot;全局变量&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">my_job:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">env:</span> <span class="comment"># ✅ `job` 级变量（适用于 `my_job`）</span></span><br><span class="line">      <span class="attr">JOB_VAR:</span> <span class="string">&quot;任务变量&quot;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">显示全局变量</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$GLOBAL_VAR&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">显示任务变量</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$JOB_VAR&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">设置步骤变量</span></span><br><span class="line">        <span class="attr">env:</span> <span class="comment"># ✅ `step` 级变量（仅适用于本 `step`）</span></span><br><span class="line">          <span class="attr">STEP_VAR:</span> <span class="string">&quot;步骤变量&quot;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$STEP_VAR&quot;</span></span><br></pre></td></tr></table></figure><p>执行结果：</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">全局变量</span><br><span class="line">任务变量</span><br><span class="line">步骤变量</span><br></pre></td></tr></table></figure><h3 id="8-3-env变量的作用范围"><a href="#8-3-env变量的作用范围" class="headerlink" title="8.3 env变量的作用范围"></a>8.3 <code>env</code>变量的作用范围</h3><table><thead><tr><th>作用域</th><th>关键字</th><th>影响范围</th></tr></thead><tbody><tr><td>工作流级</td><td><code>env:</code></td><td>适用于整个 <code>.yml</code> 文件</td></tr><tr><td>任务级</td><td><code>jobs.&lt;job_name&gt;.env:</code></td><td>适用于 job 内所有 steps</td></tr><tr><td>步骤级</td><td><code>jobs.&lt;job_name&gt;.steps[].env:</code></td><td>仅适用于该 step</td></tr></tbody></table><h3 id="8-4-使用env变量"><a href="#8-4-使用env变量" class="headerlink" title="8.4 使用env变量"></a>8.4 使用<code>env</code>变量</h3><h4 id="8-4-1-读取环境变量"><a href="#8-4-1-读取环境变量" class="headerlink" title="8.4.1 读取环境变量"></a>8.4.1 读取环境变量</h4><p>在<code>run</code>里使用不同的 Shell 读取<code>env</code>变量：</p><table><thead><tr><th>操作系统</th><th>Shell</th><th>读取方法</th></tr></thead><tbody><tr><td>Linux&#x2F;macOS</td><td>Bash</td><td><code>$VAR_NAME</code></td></tr><tr><td>Windows</td><td>PowerShell</td><td><code>$env:VAR_NAME</code></td></tr><tr><td>Windows</td><td>CMD</td><td><code>%VAR_NAME%</code></td></tr></tbody></table><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">example:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">env:</span></span><br><span class="line">      <span class="attr">MESSAGE:</span> <span class="string">&quot;Hello from job&quot;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取环境变量（Linux/macOS）</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$MESSAGE&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取环境变量（Windows）</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">Write-Output</span> <span class="string">$env:MESSAGE</span></span><br><span class="line">        <span class="attr">shell:</span> <span class="string">pwsh</span></span><br></pre></td></tr></table></figure><p>输出：</p><figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Hello <span class="keyword">from</span> job</span><br><span class="line">Hello <span class="keyword">from</span> job</span><br></pre></td></tr></table></figure><h4 id="8-4-2-组合多个变量"><a href="#8-4-2-组合多个变量" class="headerlink" title="8.4.2 组合多个变量"></a>8.4.2 组合多个变量</h4><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">example:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">env:</span></span><br><span class="line">      <span class="attr">USER_NAME:</span> <span class="string">&quot;Alice&quot;</span></span><br><span class="line">      <span class="attr">GREETING:</span> <span class="string">&quot;Hello&quot;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">使用多个变量</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$GREETING, $USER_NAME!&quot;</span></span><br></pre></td></tr></table></figure><p>输出：</p><figure class="highlight autohotkey"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Hello,</span> Alice!</span><br></pre></td></tr></table></figure><h3 id="8-5-env变量的高级用法"><a href="#8-5-env变量的高级用法" class="headerlink" title="8.5 env变量的高级用法"></a>8.5 <code>env</code>变量的高级用法</h3><h4 id="8-5-1-GITHUB-ENV（动态设置env变量）"><a href="#8-5-1-GITHUB-ENV（动态设置env变量）" class="headerlink" title="8.5.1 GITHUB_ENV（动态设置env变量）"></a>8.5.1 <code>GITHUB_ENV</code>（动态设置<code>env</code>变量）</h4><p>可以在<code>run</code>中动态创建<code>env</code>变量。</p><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">example:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">设置环境变量</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;MY_VAR=动态变量&quot;</span> <span class="string">&gt;&gt;</span> <span class="string">$GITHUB_ENV</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取环境变量</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$MY_VAR&quot;</span></span><br></pre></td></tr></table></figure><p>输出：</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">动态变量</span><br></pre></td></tr></table></figure><h4 id="8-5-2-读取-GitHub-内置环境变量"><a href="#8-5-2-读取-GitHub-内置环境变量" class="headerlink" title="8.5.2 读取 GitHub 内置环境变量"></a>8.5.2 读取 GitHub 内置环境变量</h4><p>GitHub 提供了许多内置变量，可以直接在<code>env</code>里使用。</p><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">example:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">显示</span> <span class="string">GitHub</span> <span class="string">内置变量</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;当前仓库: $<span class="template-variable">&#123;&#123; github.repository &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>可能输出：</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">当前仓库: <span class="keyword">my</span>-user/<span class="keyword">my</span>-repo</span><br></pre></td></tr></table></figure><p>常见 GitHub 内置变量：</p><table><thead><tr><th>变量</th><th>作用</th></tr></thead><tbody><tr><td><code>$&#123;&#123; github.repository &#125;&#125;</code></td><td>仓库名 (owner&#x2F;repo)</td></tr><tr><td><code>$&#123;&#123; github.ref &#125;&#125;</code></td><td>触发的分支&#x2F;标签</td></tr><tr><td><code>$&#123;&#123; github.event_name &#125;&#125;</code></td><td>触发事件 (push, pull_request)</td></tr><tr><td><code>$&#123;&#123; github.actor &#125;&#125;</code></td><td>触发工作流的用户</td></tr><tr><td><code>$&#123;&#123; github.run_id &#125;&#125;</code></td><td>运行 ID（唯一）</td></tr></tbody></table><h4 id="8-5-3-secrets（私密变量）"><a href="#8-5-3-secrets（私密变量）" class="headerlink" title="8.5.3 secrets（私密变量）"></a>8.5.3 <code>secrets</code>（私密变量）</h4><p><code>secrets</code>用于存储敏感数据（如 API 密钥），不会暴露在日志里。</p><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">example:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取</span> <span class="string">GitHub</span> <span class="string">密钥</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;TOKEN = $<span class="template-variable">&#123;&#123; secrets.MY_SECRET &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>如何添加<code>secrets</code>：</p><ol><li><p>进入 GitHub 仓库Settings</p></li><li><p>打开Secrets and variables→选择Actions</p></li><li><p>点击New repository secret</p></li><li><p>添加<code>MY_SECRET</code>，值为<code>my_secret_value</code></p></li></ol><h4 id="8-5-4-env变量-vssecrets"><a href="#8-5-4-env变量-vssecrets" class="headerlink" title="8.5.4 env变量 vssecrets"></a>8.5.4 <code>env</code>变量 vs<code>secrets</code></h4><table><thead><tr><th>类型</th><th>适用场景</th><th>是否加密</th><th>是否可在 UI 查看</th></tr></thead><tbody><tr><td><code>env</code></td><td>普通环境变量</td><td>❌ 否</td><td>✅ 可以</td></tr><tr><td><code>secrets</code></td><td>敏感信息（API 密钥）</td><td>✅ 是</td><td>❌ 不可</td></tr></tbody></table><p>####8.6 <code>env</code>变量的常见问题</p><p>❓1.为什么<code>env</code>变量在<code>run</code>里无效？</p><p>正确写法：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取</span> <span class="string">`env`</span></span><br><span class="line">    <span class="attr">env:</span></span><br><span class="line">      <span class="attr">MESSAGE:</span> <span class="string">&quot;Hello&quot;</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$MESSAGE&quot;</span></span><br></pre></td></tr></table></figure><p>错误写法：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">变量未定义</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$MESSAGE&quot;</span>  <span class="comment"># 变量未在 `env` 定义</span></span><br></pre></td></tr></table></figure><p>修正：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">先定义变量</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;MESSAGE=Hello&quot;</span> <span class="string">&gt;&gt;</span> <span class="string">$GITHUB_ENV</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取变量</span></span><br><span class="line">    <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;$MESSAGE&quot;</span></span><br></pre></td></tr></table></figure><p>❓2.<code>secrets</code>变量为什么在日志里不显示？</p><p>GitHub 自动隐藏<code>secrets</code>变量，即使你<code>echo</code>也不会显示。</p><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">example:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">读取密钥</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;TOKEN=$<span class="template-variable">&#123;&#123; secrets.MY_SECRET &#125;&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>错误输出：</p><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">TOKEN</span><span class="operator">=</span>***</span><br></pre></td></tr></table></figure><p>正确输出：</p><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">TOKEN</span><span class="operator">=</span>your_actual_secret_value  （但不会显示在 GitHub UI）</span><br></pre></td></tr></table></figure><h2 id="9-uses语法"><a href="#9-uses语法" class="headerlink" title="9 uses语法"></a>9 <code>uses</code>语法</h2><p>uses语法过多自行访问<a href="https://github.com/marketplace?type=actions">GitHub Marketplace</a>查找</p><h2 id="官方文档"><a href="#官方文档" class="headerlink" title="官方文档"></a>官方文档</h2><p>更具体的请看官方文档吧！如果上面内容有有错误欢迎指出！</p><ul><li><a href="https://docs.github.com/zh/actions">GitHub Actions 文档</a></li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;1-GitHub-Actions-的基本概念&quot;&gt;&lt;a href=&quot;#1-GitHub-Actions-的基本概念&quot; class=&quot;headerlink&quot; title=&quot;1 GitHub Actions 的基本概念&quot;&gt;&lt;/a&gt;1 GitHub Actions</summary>
        
      
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Github" scheme="https://blog.natuie.net/tags/Github/"/>
    
    <category term="Actions" scheme="https://blog.natuie.net/tags/Actions/"/>
    
  </entry>
  
  <entry>
    <title>企业微信如何获取 Webhook 实现消息推送</title>
    <link href="https://blog.natuie.net/posts/2025/02/03/170201/"/>
    <id>https://blog.natuie.net/posts/2025/02/03/170201/</id>
    <published>2025-02-03T09:02:01.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h3 id="获取Webhook"><a href="#获取Webhook" class="headerlink" title="获取Webhook"></a>获取Webhook</h3><p>这边以Android的企业微信为例，打开企业微信登录 。点击底部消息 -&gt; 右上角+号 -&gt; 发起群聊 -&gt; 选择人创建并打开群聊 -&gt; 点击三个点 -&gt; 群机器人 -&gt; 创建就能看到了。<br>其他平台的都一样的，就是只能是企业群聊才可以，外部群聊不行。</p><p>添加成功后，系统会生成一个 Webhook URL，格式如下：<br>     <figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:<span class="regexp">//</span>qyapi.weixin.qq.com<span class="regexp">/cgi-bin/</span>webhook/send?key=your_key</span><br></pre></td></tr></table></figure><br>   复制并保存这个 URL，后续将用于发送消息</p><h3 id="二、发送消息"><a href="#二、发送消息" class="headerlink" title="二、发送消息"></a>二、发送消息</h3><p>企业微信 Webhook 支持多种消息类型，包括文本、Markdown、图片、文件等。以下以发送文本消息为例。</p><h4 id="1-文本消息格式"><a href="#1-文本消息格式" class="headerlink" title="1. 文本消息格式"></a>1. <strong>文本消息格式</strong></h4><ul><li>请求方式：<code>POST</code></li><li>请求头：<code>Content-Type: application/json</code></li><li>请求体示例：<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;msgtype&quot;</span><span class="punctuation">:</span> <span class="string">&quot;text&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span> <span class="string">&quot;这是一条测试消息&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li></ul><h4 id="2-使用-cURL-发送消息"><a href="#2-使用-cURL-发送消息" class="headerlink" title="2. 使用 cURL 发送消息"></a>2. <strong>使用 cURL 发送消息</strong></h4><ul><li>在终端中运行以下命令：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">curl <span class="string">&#x27;https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key&#x27;</span> \</span><br><span class="line">  -H <span class="string">&#x27;Content-Type: application/json&#x27;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">        &quot;msgtype&quot;: &quot;text&quot;,</span></span><br><span class="line"><span class="string">        &quot;text&quot;: &#123;</span></span><br><span class="line"><span class="string">          &quot;content&quot;: &quot;这是一条测试消息&quot;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;&#x27;</span></span><br></pre></td></tr></table></figure></li></ul><h4 id="3-使用-Python-发送消息"><a href="#3-使用-Python-发送消息" class="headerlink" title="3. 使用 Python 发送消息"></a>3. <strong>使用 Python 发送消息</strong></h4><ul><li>安装 <code>requests</code> 库（如果尚未安装）：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install requests</span><br></pre></td></tr></table></figure></li><li>编写 Python 脚本：<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"></span><br><span class="line">webhook_url = <span class="string">&quot;https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key&quot;</span></span><br><span class="line">headers = &#123;<span class="string">&quot;Content-Type&quot;</span>: <span class="string">&quot;application/json&quot;</span>&#125;</span><br><span class="line">data = &#123;</span><br><span class="line">    <span class="string">&quot;msgtype&quot;</span>: <span class="string">&quot;text&quot;</span>,</span><br><span class="line">    <span class="string">&quot;text&quot;</span>: &#123;</span><br><span class="line">        <span class="string">&quot;content&quot;</span>: <span class="string">&quot;这是一条测试消息&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">response = requests.post(webhook_url, headers=headers, data=json.dumps(data))</span><br><span class="line"><span class="built_in">print</span>(response.status_code, response.text)</span><br></pre></td></tr></table></figure></li></ul><hr><h3 id="三、支持的消息类型"><a href="#三、支持的消息类型" class="headerlink" title="三、支持的消息类型"></a>三、支持的消息类型</h3><p>除了文本消息，企业微信 Webhook 还支持以下消息类型：</p><ol><li><p><strong>Markdown 消息</strong></p><ul><li>请求体示例：<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;msgtype&quot;</span><span class="punctuation">:</span> <span class="string">&quot;markdown&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;markdown&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span> <span class="string">&quot;**加粗文字**\n&gt; 引用内容&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p><strong>图片消息</strong></p></li></ol><ul><li>请求头实例: <figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;msgtype&quot;</span><span class="punctuation">:</span> <span class="string">&quot;image&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;image&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;base64&quot;</span><span class="punctuation">:</span> <span class="string">&quot;DATA&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;md5&quot;</span><span class="punctuation">:</span> <span class="string">&quot;MD5&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>base64是图片内容的base64编码<br>md5是图片内容（base64编码前）的md5值</li></ul><blockquote><p>注：图片（base64编码前）最大不能超过2M，支持JPG,PNG格式</p></blockquote><ol start="3"><li><p><strong>文件消息</strong></p><ul><li>通过下文的上传文件接口获取 <code>media_id</code>，然后发送：<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;msgtype&quot;</span><span class="punctuation">:</span> <span class="string">&quot;file&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;media_id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;your_media_id&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p><strong>图文消息</strong></p><ul><li>请求体示例：<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;msgtype&quot;</span><span class="punctuation">:</span> <span class="string">&quot;news&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;news&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;articles&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;标题&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;描述&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;picurl&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://example.com/image.png&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li></ul></li></ol><hr><p>只提供部分实例，具体请参考 <a href="https://developer.work.weixin.qq.com/document/path/91770">群机器人配置说明</a> </p><h3 id="四、注意事项"><a href="#四、注意事项" class="headerlink" title="四、注意事项"></a>四、注意事项</h3><ol><li><p><strong>消息频率限制</strong></p><ul><li>每个 Webhook URL 每分钟最多发送 20 条消息，超过限制会被暂时禁用。</li></ul></li><li><p><strong>安全性</strong></p><ul><li>Webhook URL 包含密钥，请勿泄露。如果泄露，可以在企业微信管理后台重新生成。</li></ul></li><li><p><strong>错误处理</strong></p><ul><li>如果发送失败，检查返回的状态码和错误信息：<ul><li><code>400</code>：请求参数错误。</li><li><code>404</code>：Webhook URL 无效。</li><li><code>429</code>：消息发送频率过高。</li></ul></li></ul></li></ol><hr><h3 id="五、总结"><a href="#五、总结" class="headerlink" title="五、总结"></a>五、总结</h3><p>通过企业微信 Webhook，开发者可以轻松实现消息推送功能。无论是监控报警、任务通知，还是自动化流程，Webhook 都提供了简单高效的解决方案。</p><p>如果你有更多问题或需要进一步的帮助，请参考 <a href="https://work.weixin.qq.com/api/doc">企业微信官方文档</a> 或留言讨论。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;获取Webhook&quot;&gt;&lt;a href=&quot;#获取Webhook&quot; class=&quot;headerlink&quot; title=&quot;获取Webhook&quot;&gt;&lt;/a&gt;获取Webhook&lt;/h3&gt;&lt;p&gt;这边以Android的企业微信为例，打开企业微信登录 。点击底部消息 -&amp;gt;</summary>
        
      
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="企业微信,Webhook" scheme="https://blog.natuie.net/tags/%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1-Webhook/"/>
    
  </entry>
  
  <entry>
    <title>SpringBoot3 解决不支持双斜杠问题</title>
    <link href="https://blog.natuie.net/posts/2025/02/03/124815/"/>
    <id>https://blog.natuie.net/posts/2025/02/03/124815/</id>
    <published>2025-02-03T04:48:15.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h3 id="方法一："><a href="#方法一：" class="headerlink" title="方法一："></a>方法一：</h3><p>在<code>application.yml</code>写</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line">  <span class="attr">mvc:</span></span><br><span class="line">    <span class="attr">pathmatch:</span></span><br><span class="line">      <span class="attr">matching-strategy:</span> <span class="string">ant_path_matcher</span></span><br></pre></td></tr></table></figure><p>或者在application.properties写</p><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">spring.mvc.pathmatch.matching-strategy</span>=<span class="string">ant_path_matcher</span></span><br></pre></td></tr></table></figure><p>方法二：<br>在启动类Application加上</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line">    HttpFirewall <span class="title function_">httpFirewall</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="type">StrictHttpFirewall</span> <span class="variable">firewall</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StrictHttpFirewall</span>();</span><br><span class="line">        firewall.setAllowUrlEncodedDoubleSlash(<span class="literal">true</span>);</span><br><span class="line">        <span class="keyword">return</span> firewall;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>原因很简单，Spring Boot干掉了双斜杠。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;方法一：&quot;&gt;&lt;a href=&quot;#方法一：&quot; class=&quot;headerlink&quot; title=&quot;方法一：&quot;&gt;&lt;/a&gt;方法一：&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;application.yml&lt;/code&gt;写&lt;/p&gt;
&lt;figure class=&quot;highlight</summary>
        
      
    
    
    
    <category term="SpringBoot" scheme="https://blog.natuie.net/categories/SpringBoot/"/>
    
    
  </entry>
  
  <entry>
    <title>Termux 使用 curl 出现 CANNOT LINK EXECUTABLE curl 问题</title>
    <link href="https://blog.natuie.net/posts/2025/02/03/124648/"/>
    <id>https://blog.natuie.net/posts/2025/02/03/124648/</id>
    <published>2025-02-03T04:46:48.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h3 id="问题与解决"><a href="#问题与解决" class="headerlink" title="问题与解决"></a>问题与解决</h3><p>刚开始使用Termux的时候可能会出现: </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ curl</span><br><span class="line">CANNOT LINK EXECUTABLE <span class="string">&quot;curl&quot;</span>: library <span class="string">&quot;libssl.so.1.1&quot;</span> not found: needed by /data/data/com.termux/files/usr/lib/libssh2.so <span class="keyword">in</span> namespace (default)</span><br></pre></td></tr></table></figure><p>解决方案就是: </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pkg update</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;问题与解决&quot;&gt;&lt;a href=&quot;#问题与解决&quot; class=&quot;headerlink&quot; title=&quot;问题与解决&quot;&gt;&lt;/a&gt;问题与解决&lt;/h3&gt;&lt;p&gt;刚开始使用Termux的时候可能会出现: &lt;/p&gt;
&lt;figure class=&quot;highlight</summary>
        
      
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="curl" scheme="https://blog.natuie.net/tags/curl/"/>
    
    <category term="Termux" scheme="https://blog.natuie.net/tags/Termux/"/>
    
  </entry>
  
  <entry>
    <title>探索动态图片背后的秘密：提取视频</title>
    <link href="https://blog.natuie.net/posts/2025/02/02/115658/"/>
    <id>https://blog.natuie.net/posts/2025/02/02/115658/</id>
    <published>2025-02-02T03:56:58.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h3 id="探索动态图片"><a href="#探索动态图片" class="headerlink" title="探索动态图片"></a>探索动态图片</h3><p>近日，我在编辑一张动态图片时，意外发现了一段有趣的元数据。这段数据不仅揭示了图片拍摄时的信息，还隐藏了一个关于视频的秘密。</p><p>在深入探索这张图片的元数据时，我注意到了GCamera:MicroVideoOffset这一字段。经过研究，我了解到这个字段代表的是视频偏移量，意味着在这个地址之后，隐藏着视频数据。</p><p>具体来说，这张动态图片实际上包含了一个微视频。通过解析GCamera:MicroVideoOffset所指示的位置，我们可以直接截取到这段视频。</p><p>以下是部分元数据的展示（已省略部分内容以节省篇幅）：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">&lt;x:xmpmeta xmlns:x=&quot;adobe:ns:meta/&quot; x:xmptk=&quot;Adobe XMP Core 5.1.0-jc003&quot;&gt;</span><br><span class="line">  &lt;rdf:RDF xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;</span><br><span class="line">    &lt;rdf:Description rdf:about=&quot;&quot;</span><br><span class="line">        xmlns:GCamera=&quot;http://ns.google.com/photos/1.0/camera/&quot;</span><br><span class="line">        xmlns:MiCamera=&quot;http://ns.phone.com/photos/1.0/camera/&quot;</span><br><span class="line">      GCamera:MicroVideoVersion=&quot;1&quot;</span><br><span class="line">      GCamera:MicroVideo=&quot;1&quot;</span><br><span class="line">      GCamera:MicroVideoOffset=&quot;2013388&quot;</span><br><span class="line">      GCamera:MicroVideoPresentationTimestampUs=&quot;722627&quot;</span><br><span class="line">      MiCamera:XMPMeta=&quot;&amp;lt;?xml version=&#x27;1.0&#x27; encoding=&#x27;UTF-8&#x27; standalone=&#x27;yes&#x27; ?&amp;gt;&quot;/&gt;</span><br><span class="line">  &lt;/rdf:RDF&gt;</span><br><span class="line">&lt;/x:xmpmeta&gt;</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>从上面的元数据可以看出，GCamera:MicroVideoOffset的值为“2013388”，这表示视频数据位于该偏移量之后。</p><h3 id="验证猜想"><a href="#验证猜想" class="headerlink" title="验证猜想"></a>验证猜想</h3><p>为了验证这一发现，我尝试使用tail命令来提取视频。虽然tail命令通常用于查看文件的末尾部分，但在这里，我们可以通过指定偏移量和字节数来截取包含视频数据的部分。</p><p>我们可以使用以下命令来提取视频：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">tail</span> -c +2013388 动态图片文件 &gt; 提取的视频文件</span><br></pre></td></tr></table></figure><p>然而，需要注意的是，这里的“+2013388”表示从文件的第2013388个字节开始提取。</p><p>结果，提取的那个视频正好可以播放。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;探索动态图片&quot;&gt;&lt;a href=&quot;#探索动态图片&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="动态图片" scheme="https://blog.natuie.net/tags/%E5%8A%A8%E6%80%81%E5%9B%BE%E7%89%87/"/>
    
  </entry>
  
  <entry>
    <title>使用 Fish 导致找不到库或文件的问题</title>
    <link href="https://blog.natuie.net/posts/2025/02/01/203438/"/>
    <id>https://blog.natuie.net/posts/2025/02/01/203438/</id>
    <published>2025-02-01T12:34:38.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Fish-环境变量设置差异对程序运行的影响"><a href="#Fish-环境变量设置差异对程序运行的影响" class="headerlink" title="Fish 环境变量设置差异对程序运行的影响"></a>Fish 环境变量设置差异对程序运行的影响</h3><p>Fish（Friendly Interactive SHell）凭借其友好的用户界面和简洁的语法，也逐渐赢得了不少用户的青睐。然而，Fish在环境变量设置方式上的独特之处，可能会给一些程序带来运行上的困扰。</p><h4 id="Fish环境变量设置的独特性"><a href="#Fish环境变量设置的独特性" class="headerlink" title="Fish环境变量设置的独特性"></a>Fish环境变量设置的独特性</h4><p>与其他Shell相比，Fish在环境变量设置方面有着显著的不同。在Fish中，set命令被用于设置变量，但赋值时并不使用等号（&#x3D;），而是通过空格直接分隔变量名和值。例如，要设置一个名为MY_VAR的变量，并赋值为hello，在Fish中应使用以下命令：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> MY_VAR hello</span><br></pre></td></tr></table></figure><p>而在Bash等Shell中，相同的操作则使用等号进行赋值，如下所示：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> MY_VAR=hello</span><br></pre></td></tr></table></figure><p> 正是这种差异导致了Fish环境变量设置方式与其他Shell有所不同，这可能导致一些程序在Fish中运行时找不到所需的路径或变量。</p><h4 id="程序兼容性问题"><a href="#程序兼容性问题" class="headerlink" title="程序兼容性问题"></a>程序兼容性问题</h4><p>脚本兼容性问题：一些程序可能通过脚本（如Bash脚本）来执行特定的任务。如果这些脚本是为其他Shell编写的，并且包含了对特定Shell命令或特性的依赖，那么当它们在Fish中运行时，可能会因为不兼容而导致错误。</p><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><p>针对上述问题，以下是一些可能的解决方案：</p><ol><li><p>修改脚本以适应Fish：如果程序是通过脚本运行的，并且脚本中存在对其他Shell的依赖，那么可以尝试修改脚本，使其兼容Fish。这通常涉及到替换特定的Shell命令或语法。</p></li><li><p>在Fish中设置正确的环境变量和路径：确保在Fish中正确设置了程序所需的所有环境变量和路径。这可以通过手动设置变量或使用Fish的配置文件（如config.fish）来实现。</p></li><li><p>使用其他Shell运行程序：如果修改脚本或设置环境变量不可行，或者程序对Shell的依赖过于复杂，那么可以考虑使用其他Shell（如Bash或Zsh）来运行程序。这可以通过在Fish中调用其他Shell的命令行界面来实现。</p></li></ol>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;Fish-环境变量设置差异对程序运行的影响&quot;&gt;&lt;a href=&quot;#Fish-环境变量设置差异对程序运行的影响&quot; class=&quot;headerlink&quot; title=&quot;Fish 环境变量设置差异对程序运行的影响&quot;&gt;&lt;/a&gt;Fish</summary>
        
      
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Fish" scheme="https://blog.natuie.net/tags/Fish/"/>
    
  </entry>
  
  <entry>
    <title>还在为 SSH 自动断连烦恼？试试 Tmux 吧！</title>
    <link href="https://blog.natuie.net/posts/2025/02/01/190939/"/>
    <id>https://blog.natuie.net/posts/2025/02/01/190939/</id>
    <published>2025-02-01T11:09:39.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h3 id="使用-SSH-自动断连问题"><a href="#使用-SSH-自动断连问题" class="headerlink" title="使用 SSH 自动断连问题"></a>使用 SSH 自动断连问题</h3><p>在使用 SSH 远程连接服务器时，经常会遇到网络不稳定或长时间无操作导致连接中断的情况。这不仅会影响工作效率，还可能导致未保存的工作丢失。为了解决这个问题，我们可以使用 <code>tmux</code>，一个强大的终端复用工具。</p><hr><h4 id="1-什么是-Tmux？"><a href="#1-什么是-Tmux？" class="headerlink" title="1. 什么是 Tmux？"></a>1. 什么是 Tmux？</h4><p><code>tmux</code> 是一个终端复用工具，允许用户在一个终端窗口中创建多个会话、窗口和面板。它的核心功能包括：</p><ul><li><strong>会话管理</strong>：可以在一个终端中创建多个会话，并在这些会话之间自由切换。</li><li><strong>窗口和面板</strong>：每个会话可以包含多个窗口，每个窗口又可以分割成多个面板。</li><li><strong>断线重连</strong>：即使 SSH 连接中断，<code>tmux</code> 会话仍然会保留在服务器上，重新连接后可以恢复工作状态。</li></ul><p>正是这些特性，使得 <code>tmux</code> 成为解决 SSH 自动断连问题的利器。</p><h4 id="2-安装-Tmux"><a href="#2-安装-Tmux" class="headerlink" title="2. 安装 Tmux"></a>2. 安装 Tmux</h4><p>在大多数 Linux 发行版中，<code>tmux</code> 可以通过包管理器直接安装。</p><ul><li><p><strong>Debian&#x2F;Ubuntu</strong>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install tmux</span><br></pre></td></tr></table></figure></li><li><p><strong>CentOS&#x2F;RHEL</strong>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install tmux</span><br></pre></td></tr></table></figure></li><li><p><strong>macOS</strong>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install tmux</span><br></pre></td></tr></table></figure></li></ul><p>安装完成后，可以通过 <code>tmux -V</code> 检查是否安装成功。</p><h4 id="3-基本使用"><a href="#3-基本使用" class="headerlink" title="3. 基本使用"></a>3. 基本使用</h4><h5 id="启动-Tmux-会话"><a href="#启动-Tmux-会话" class="headerlink" title="启动 Tmux 会话"></a>启动 Tmux 会话</h5><p>在终端中输入以下命令启动一个新的 <code>tmux</code> 会话：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tmux</span><br></pre></td></tr></table></figure><p>这会创建一个新的会话，并进入一个全新的终端环境。</p><h5 id="命名会话"><a href="#命名会话" class="headerlink" title="命名会话"></a>命名会话</h5><p>为了方便管理，可以为会话命名后再启动：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tmux new -s mysession</span><br></pre></td></tr></table></figure><p>其中 <code>mysession</code> 是你为会话指定的名称。</p><h5 id="分离会话"><a href="#分离会话" class="headerlink" title="分离会话"></a>分离会话</h5><p>在 <code>tmux</code> 会话中，按下 <code>Ctrl + b</code>，然后按 <code>d</code>，可以分离当前会话。此时会话会在后台继续运行，即使 SSH 断开也不会影响。</p><h5 id="重新连接会话"><a href="#重新连接会话" class="headerlink" title="重新连接会话"></a>重新连接会话</h5><p>重新连接 SSH 后，可以通过以下命令重新连接到之前的会话：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tmux attach -t mysession</span><br></pre></td></tr></table></figure><p>其中 <code>mysession</code> 是你要恢复的会话名称。</p><h5 id="查看所有会话"><a href="#查看所有会话" class="headerlink" title="查看所有会话"></a>查看所有会话</h5><p>如果想查看当前所有的 <code>tmux</code> 会话，可以使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tmux <span class="built_in">ls</span></span><br></pre></td></tr></table></figure><hr><h4 id="4-解决-SSH-自动断连问题"><a href="#4-解决-SSH-自动断连问题" class="headerlink" title="4. 解决 SSH 自动断连问题"></a>4. 解决 SSH 自动断连问题</h4><p><code>tmux</code> 的核心优势在于它的会话持久化功能。以下是具体的使用场景：</p><ol><li><p><strong>启动 Tmux 会话</strong><br>在 SSH 连接到服务器后，立即启动一个 <code>tmux</code> 会话：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tmux new -s work</span><br></pre></td></tr></table></figure></li><li><p><strong>在 Tmux 中工作</strong><br>在 <code>tmux</code> 会话中运行你的任务，例如编辑文件、运行脚本等。</p></li><li><p><strong>网络中断或 SSH 断开</strong><br>如果网络不稳定或 SSH 连接中断，<code>tmux</code> 会话仍然会在服务器上运行。</p></li><li><p><strong>重新连接并恢复工作</strong><br>重新 SSH 连接到服务器后，使用以下命令恢复之前的会话：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tmux attach -t work</span><br></pre></td></tr></table></figure><p>你会发现所有的工作状态都完好无损。</p></li></ol><h4 id="5-常用-Tmux-快捷键"><a href="#5-常用-Tmux-快捷键" class="headerlink" title="5. 常用 Tmux 快捷键"></a>5. 常用 Tmux 快捷键</h4><p>以下是一些常用的 <code>tmux</code> 快捷键（默认前缀键为 <code>Ctrl + b</code>）：</p><ul><li><strong>创建新窗口</strong>：<code>Ctrl + b, c</code></li><li><strong>切换窗口</strong>：<code>Ctrl + b, 窗口编号</code>（例如 <code>Ctrl + b, 0</code> 切换到第一个窗口）</li><li><strong>水平分割面板</strong>：<code>Ctrl + b, &quot;</code></li><li><strong>垂直分割面板</strong>：<code>Ctrl + b, %</code></li><li><strong>切换面板</strong>：<code>Ctrl + b, 方向键</code>（例如 <code>Ctrl + b, →</code> 切换到右侧面板）</li><li><strong>关闭面板</strong>：<code>Ctrl + b, x</code></li><li><strong>列出所有会话</strong>：<code>Ctrl + b, s</code></li><li><strong>重命名当前会话</strong>：<code>Ctrl + b, $</code></li></ul><h4 id="6-高级技巧"><a href="#6-高级技巧" class="headerlink" title="6. 高级技巧"></a>6. 高级技巧</h4><h5 id="自动启动-Tmux"><a href="#自动启动-Tmux" class="headerlink" title="自动启动 Tmux"></a>自动启动 Tmux</h5><p>如果你希望每次 SSH 登录时自动启动或恢复 <code>tmux</code> 会话，可以将以下代码添加到 <code>~/.bashrc</code> 或 <code>~/.zshrc</code> 中：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [[ -z <span class="string">&quot;<span class="variable">$TMUX</span>&quot;</span> ]] &amp;&amp; [[ -n <span class="string">&quot;<span class="variable">$SSH_CONNECTION</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">  tmux attach -t ssh || tmux new -s ssh</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>这样，每次 SSH 登录时，<code>tmux</code> 会自动恢复名为 <code>ssh</code> 的会话，或者创建一个新的会话。</p><h5 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h5><p><code>tmux</code> 支持通过配置文件（<code>~/.tmux.conf</code>）自定义行为。例如，可以修改前缀键、启用鼠标支持等。以下是一个简单的配置示例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将前缀键改为 Ctrl + a</span></span><br><span class="line">unbind C-b</span><br><span class="line">set-option -g prefix C-a</span><br><span class="line"><span class="built_in">bind</span> C-a send-prefix</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启用鼠标支持</span></span><br><span class="line"><span class="built_in">set</span> -g mouse on</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置状态栏颜色</span></span><br><span class="line"><span class="built_in">set</span> -g status-bg blue</span><br><span class="line"><span class="built_in">set</span> -g status-fg white</span><br></pre></td></tr></table></figure><hr><h4 id="7-总结"><a href="#7-总结" class="headerlink" title="7. 总结"></a>7. 总结</h4><p>通过使用 <code>tmux</code>，你可以轻松解决 SSH 自动断连的问题，同时提高终端操作的效率。无论是长时间运行的任务，还是多任务并行处理，<code>tmux</code> 都能为你提供一个稳定、灵活的工作环境。</p><p>如果你还没有尝试过 <code>tmux</code>，不妨从今天开始使用它，体验它带来的便利吧！</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;使用-SSH-自动断连问题&quot;&gt;&lt;a href=&quot;#使用-SSH-自动断连问题&quot; class=&quot;headerlink&quot; title=&quot;使用 SSH 自动断连问题&quot;&gt;&lt;/a&gt;使用 SSH 自动断连问题&lt;/h3&gt;&lt;p&gt;在使用 SSH</summary>
        
      
    
    
    
    <category term="工具" scheme="https://blog.natuie.net/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="SSH,Tmux" scheme="https://blog.natuie.net/tags/SSH-Tmux/"/>
    
  </entry>
  
  <entry>
    <title>Windows Hexo 使用 Rsync 发布踩坑指南</title>
    <link href="https://blog.natuie.net/posts/2025/02/01/102426/"/>
    <id>https://blog.natuie.net/posts/2025/02/01/102426/</id>
    <published>2025-02-01T02:24:26.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h3 id="问题与解决方案"><a href="#问题与解决方案" class="headerlink" title="问题与解决方案"></a>问题与解决方案</h3><p>在使用 Hexo 生成静态博客并发布到远程服务器时，<code>rsync</code> 是一个非常高效的工具。然而，在 Windows 环境下使用 <code>rsync</code> 可能会遇到一些问题。</p><h4 id="错误：-rsync-�����ڲ����ⲿ���Ҳ���o����еĳ���"><a href="#错误：-rsync-�����ڲ����ⲿ���Ҳ���o����еĳ���" class="headerlink" title="错误：&#39;rsync&#39; �����ڲ����ⲿ���Ҳ���ǿ����еĳ���"></a>错误：<code>&#39;rsync&#39; �����ڲ����ⲿ���Ҳ���ǿ����еĳ���</code></h4><p>这个错误通常是因为系统找不到 <code>rsync</code> 可执行文件。解决方法如下：</p><ol><li><p><strong>检查环境变量</strong><br>确保 <code>rsync</code> 的路径已经添加到系统的 <code>PATH</code> 环境变量中。</p></li><li><p><strong>使用绝对路径</strong><br>如果你使用的是 <code>cwRsync</code>，可以在 Hexo 的 <code>_config.yml</code> 中使用绝对路径来指定 <code>rsync</code> 的位置。例如：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">rsync</span></span><br><span class="line">  <span class="attr">rsync:</span> <span class="string">&quot;C:/Program Files/cwRsync/bin/rsync.exe&quot;</span></span><br><span class="line">  <span class="attr">host:</span> <span class="string">your.server.com</span></span><br><span class="line">  <span class="attr">user:</span> <span class="string">your_username</span></span><br><span class="line">  <span class="attr">root:</span> <span class="string">/path/to/your/blog</span></span><br><span class="line">  <span class="attr">port:</span> <span class="number">22</span></span><br><span class="line">  <span class="attr">delete:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">verbose:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure></li></ol><h4 id="1-安装-Rsync"><a href="#1-安装-Rsync" class="headerlink" title="1. 安装 Rsync"></a>1. 安装 Rsync</h4><p>在 Windows 上，<code>rsync</code> 并不是原生支持的，因此我们需要借助第三方工具来实现。使用 <code>cwRsync</code>。</p><h5 id="使用-cwRsync"><a href="#使用-cwRsync" class="headerlink" title="使用 cwRsync"></a>使用 cwRsync</h5><ol><li><p><strong>下载 cwRsync</strong><br>访问 <a href="https://itefix.net/cwrsync">cwRsync</a> 官网，下载并安装适合你系统的版本。</p></li><li><p><strong>配置环境变量</strong><br>安装完成后，将 <code>cwRsync</code> 的安装路径（例如 <code>C:\Program Files\cwRsync\bin</code>）添加到系统的环境变量 <code>PATH</code> 中。</p></li><li><p><strong>验证安装</strong><br>打开命令提示符（CMD），输入 <code>rsync --version</code>，如果能看到版本信息，说明安装成功。</p></li></ol><h4 id="2-配置-Hexo-使用-Rsync"><a href="#2-配置-Hexo-使用-Rsync" class="headerlink" title="2. 配置 Hexo 使用 Rsync"></a>2. 配置 Hexo 使用 Rsync</h4><p>在 Hexo 的配置文件 <code>_config.yml</code> 中，找到 <code>deploy</code> 部分，添加或修改如下配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">rsync</span></span><br><span class="line">  <span class="attr">host:</span> <span class="string">your.server.com</span></span><br><span class="line">  <span class="attr">user:</span> <span class="string">your_username</span></span><br><span class="line">  <span class="attr">root:</span> <span class="string">/path/to/your/blog</span></span><br><span class="line">  <span class="attr">port:</span> <span class="number">22</span></span><br><span class="line">  <span class="attr">delete:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">verbose:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><ul><li><code>host</code>: 你的服务器地址。</li><li><code>user</code>: 登录服务器的用户名。</li><li><code>root</code>: 服务器上存放博客的路径。</li><li><code>port</code>: SSH 端口，默认为 22。</li><li><code>delete</code>: 是否删除服务器上多余的文件，建议设置为 <code>true</code>。</li><li><code>verbose</code>: 是否显示详细日志，建议设置为 <code>true</code> 以便调试。</li></ul><h4 id="4-测试发布"><a href="#4-测试发布" class="headerlink" title="4. 测试发布"></a>4. 测试发布</h4><p>完成配置后，运行以下命令来发布你的博客：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo deploy --generate</span><br></pre></td></tr></table></figure><p>如果一切顺利，你应该能够看到 <code>rsync</code> 开始同步文件，并且博客成功发布到远程服务器。</p><p>如果你还有其他问题，欢迎在评论区留言讨论</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;问题与解决方案&quot;&gt;&lt;a href=&quot;#问题与解决方案&quot; class=&quot;headerlink&quot; title=&quot;问题与解决方案&quot;&gt;&lt;/a&gt;问题与解决方案&lt;/h3&gt;&lt;p&gt;在使用 Hexo 生成静态博客并发布到远程服务器时，&lt;code&gt;rsync&lt;/code&gt;</summary>
        
      
    
    
    
    <category term="教程" scheme="https://blog.natuie.net/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Window" scheme="https://blog.natuie.net/tags/Window/"/>
    
    <category term="Hexo" scheme="https://blog.natuie.net/tags/Hexo/"/>
    
    <category term="Rsync" scheme="https://blog.natuie.net/tags/Rsync/"/>
    
  </entry>
  
  <entry>
    <title>使用GPG生成密钥遇到gpg: agent_genkey failed: No pinentry与Key generation failed: No pinentry</title>
    <link href="https://blog.natuie.net/posts/2025/01/26/225646/"/>
    <id>https://blog.natuie.net/posts/2025/01/26/225646/</id>
    <published>2025-01-26T14:56:46.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h3 id="遇到的问题"><a href="#遇到的问题" class="headerlink" title="遇到的问题"></a>遇到的问题</h3><p>您在使用 GnuPG (GPG) 生成密钥时遇到了以下错误。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">gpg: agent_genkey failed:</span> <span class="literal">No</span> <span class="string">pinentry</span></span><br><span class="line"><span class="attr">Key generation failed:</span> <span class="literal">No</span> <span class="string">pinentry</span></span><br></pre></td></tr></table></figure><p>这个错误通常是由于 pinentry 程序未正确安装或配置导致的。pinentry 是一个用于处理密码输入的辅助程序，GPG 需要它来安全地提示用户输入密码。</p><h3 id="解决此问题："><a href="#解决此问题：" class="headerlink" title="解决此问题："></a>解决此问题：</h3><h4 id="1-安装-pinentry"><a href="#1-安装-pinentry" class="headerlink" title="1. 安装 pinentry"></a>1. 安装 pinentry</h4><p>首先，确保您的系统中已安装 pinentry。根据您使用的操作系统，安装方法可能有所不同：</p><blockquote><p>Debian&#x2F;Ubuntu:</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get install pinentry</span><br></pre></td></tr></table></figure><p>Fedora: </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dnf install pinentry</span><br></pre></td></tr></table></figure><p>Arch Linux: </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pacman -S pinentry</span><br></pre></td></tr></table></figure><p>macOS (使用 Homebrew):</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install pinentry</span><br></pre></td></tr></table></figure><h4 id="2-重新使用GPG生成"><a href="#2-重新使用GPG生成" class="headerlink" title="2. 重新使用GPG生成"></a>2. 重新使用GPG生成</h4><p>如果还是没用，可以尝试重启一遍终端</p>]]></content>
    
    
    <summary type="html">这个问题通常是由于 pinentry 程序未正确安装或配置导致的。pinentry 是一个用于处理密码输入的辅助程序，GPG 需要它来安全地提示用户输入密码。</summary>
    
    
    
    <category term="工具" scheme="https://blog.natuie.net/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="问题" scheme="https://blog.natuie.net/tags/%E9%97%AE%E9%A2%98/"/>
    
    <category term="GunPG" scheme="https://blog.natuie.net/tags/GunPG/"/>
    
  </entry>
  
  <entry>
    <title>2024年最新JetBrains全家桶激活</title>
    <link href="https://blog.natuie.net/posts/2024/11/23/203036/"/>
    <id>https://blog.natuie.net/posts/2024/11/23/203036/</id>
    <published>2024-11-23T12:30:36.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<h2 id="下载破解脚本"><a href="#下载破解脚本" class="headerlink" title="下载破解脚本"></a>下载破解脚本</h2><p><a href="https://dl.natuie.net/local/JetBrains%20%E5%85%A8%E5%AE%B6%E6%A1%B6%E6%BF%80%E6%B4%BB%EF%BC%882024%E6%9C%80%E6%96%B0%EF%BC%89.zip">JetBrains 全家桶激活（2024最新）.zip | AList</a></p><h2 id="开始激活"><a href="#开始激活" class="headerlink" title="开始激活"></a>开始激活</h2><ol><li><p>首先先退出你的IDE</p></li><li><p>进入到解压后的文件夹 <code>/win2020-2024(一键激活)</code> 中，双击 <em>IDEA激活.vbs（按需选择）</em> ，若提示 <code>Success!!! Now you can enjoy IntelliJIdea to 2099</code> , 则表示你的 IDE 激活成功啦~</p></li></ol><p><img src="/img/post/172264884933578.jpg" alt="开始激活 IDEA"> </p><h3 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h3><p>启动你的IDE即可。</p><h3 id="免责声明"><a href="#免责声明" class="headerlink" title="免责声明"></a>免责声明</h3><p>本教程IDE破解补丁、激活码均收集于网络，请勿商用，仅供个人学习使用，如有侵权，请联系作者删除。若条件允许，希望大家购买正版 ！本工具不鼓励盗版，对于不正确的使用，请自行承担责任。如果你使用本工具，则表示你自动同意上述书面协议，因此，任何责任和后果请自负。</p><blockquote><p>提示：</p><p>本内容转载自<a href="https://www.quanxiaoha.com/idea-pojie/idea-pojie-20243.html">犬小哈</a>，本工具非我编写，请自行辨认！</p></blockquote>]]></content>
    
    
    <summary type="html">终于不用在担心用不起JetBrains全家桶啦！使用该工具使我的IDE 2024.3 版本激活至 2099 年。太香啦！！！</summary>
    
    
    
    <category term="Windows" scheme="https://blog.natuie.net/categories/Windows/"/>
    
    
    <category term="工具" scheme="https://blog.natuie.net/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>Windows系统激活最简单的方法详细教程</title>
    <link href="https://blog.natuie.net/posts/2024/11/23/182703/"/>
    <id>https://blog.natuie.net/posts/2024/11/23/182703/</id>
    <published>2024-11-23T10:27:03.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h2 id="方法一-：使用Microsoft-激活脚本-（MAS）"><a href="#方法一-：使用Microsoft-激活脚本-（MAS）" class="headerlink" title="方法一 ：使用Microsoft 激活脚本 （MAS）"></a>方法一 ：使用Microsoft 激活脚本 （MAS）</h2><p>开源 Windows 和 Office 激活器，具有 HWID、Ohook、KMS38 和在线 KMS 激活方法，以及高级故障排除。</p><hr><h3 id="下载-如何使用它？"><a href="#下载-如何使用它？" class="headerlink" title="下载 &#x2F; 如何使用它？"></a>下载 &#x2F; 如何使用它？</h3><h4 id="方法-1-PowerShell（Windows-8-及更高版本）-❤️"><a href="#方法-1-PowerShell（Windows-8-及更高版本）-❤️" class="headerlink" title="方法 1 - PowerShell（Windows 8 及更高版本） ❤️"></a>方法 1 - PowerShell（Windows 8 及更高版本） ❤️</h4><ol><li>打开 PowerShell（不是 CMD）。为此，请右键单击 Windows 开始菜单并选择 PowerShell 或终端。</li><li>复制并粘贴下面的代码，然后按 Enter 键</li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">irm</span> https://get.activated.win | <span class="built_in">iex</span></span><br></pre></td></tr></table></figure><ol start="3"><li><p>您将看到激活选项。 </p><p>（1） HWID： 进行 Windows 激活。</p><p>（2） Ohook ：给 Office 激活。</p><p>…如图</p><p><img src="/img/post/win_activate_cmd.png" alt="image-20241123195425963"></p></li><li><p>就这样。</p></li></ol><p>或者您可以使用以下内容（将来将弃用）。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">irm</span> https://massgrave.dev/get | <span class="built_in">iex</span></span><br></pre></td></tr></table></figure><p>该 URL 可能被某些 DNS 服务阻止，因为它是一个新域。get.activated.win</p><hr><h4 id="方法-2-传统（Windows-7-及更高版本）"><a href="#方法-2-传统（Windows-7-及更高版本）" class="headerlink" title="方法 2 - 传统（Windows 7 及更高版本）"></a>方法 2 - 传统（Windows 7 及更高版本）</h4><ol><li>使用下面提供的链接下载文件。</li></ol><ul><li><a href="https://github.com/massgravel/Microsoft-Activation-Scripts/archive/refs/heads/master.zip">https://github.com/massgravel/Microsoft-Activation-Scripts/archive/refs/heads/master.zip</a> 或者</li><li><a href="https://git.activated.win/massgrave/Microsoft-Activation-Scripts/archive/master.zip">https://git.activated.win/massgrave/Microsoft-Activation-Scripts/archive/master.zip</a></li></ul><ol start="3"><li>右键单击下载的 zip 文件并解压缩在解压缩的文件夹中，找到名为All-In-One-Version运行名为MAS_AIO.cmd您将看到激活选项，请按照屏幕上的说明进行操作。就这样。</li></ol><blockquote><p>注意：</p><ul><li>PowerShell 中的 IRM 命令从指定的 URL 下载脚本，然后 IEX 命令执行该脚本。</li><li>在执行命令之前，请务必仔细检查 URL，如果手动下载文件，请验证来源。</li><li>请谨慎，因为有些应用程序通过在 IRM 命令中使用不同的 URL 来传播伪装成 MAS 的恶意软件。</li></ul></blockquote><h2 id="方法二：使用传统桌面工具（容易报毒）"><a href="#方法二：使用传统桌面工具（容易报毒）" class="headerlink" title="方法二：使用传统桌面工具（容易报毒）"></a>方法二：使用传统桌面工具（容易报毒）</h2><p><a href="https://github.com/zbezj/HEU_KMS_Activator">HEU KMS Activator</a>中文版是一款简洁高效的KMS&#x2F;OEM智能激活工具，适用所有Windows、Office版本，无需联网即可一键激活，支持UEFI的KMS激活工具。KMS服务是微软对Windows、Office等产品的批量许可服务，利用KMS可以激活局域网内的产品。该工具利用KMS机制在系统搭建KMS服务器，从而实现在线或离线激活。</p><h3 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h3><p>点击下载安装 <a href="https://github.com/zbezj/HEU_KMS_Activator/releases/">HEU_KMS_Activator</a></p><h4 id="如何使用它？"><a href="#如何使用它？" class="headerlink" title="如何使用它？"></a>如何使用它？</h4><p><strong>功能简介</strong></p><p>1、智能激活：智能识别最佳的激活方式<br>优先顺序依次为数字许可证&#x2F;KMS38&#x2F;OEM&#x2F;KMS<br>自动识别并跳过已经永久激活的Windows&#x2F;Office</p><p>2、KMS激活<br>安装&#x2F;卸载自动续期功能，两种模式可供选择[1]自动续订模式(默认 [2]任务计划模式<br>清除KMS客户端信息：清除KMS服务器地址、端口、激活时间间隔、续订时间间隔等<br>搭建KMS服务器[手动激活]：KMS服务器地址&#x2F;端口</p><p>3、数字激活（数字许可证激活、KMS38激活）<br>添加&#x2F;解除KMS38保护，免受180天激活影响，除非解除保护，否则不能使用KMS38激活<br>查看当前系统信息：网络状态&#x2F;激活状态，描述便于快速查看是否支持数字许可证&#x2F;KMS38</p><p>4、OEM激活（提供6种模式）<br>卸载OEM激活信息：清除动态加载的SLIC等信息，OEM激活将失效<br>生产$OEM$文件夹：可将该文件夹置于ISO镜像source文件夹下，以集成OEM激活功能</p><p>5、更改Windows 10版本、激活信息备份还原、Microsoft Office 零售版转换批量授权版</p><p>6、Windows&#x2F;Office密钥管理功能：安装密钥、卸载密钥、查看密钥、清除Office许可证</p><p>7、智能激活、激活成功率高、支持静默参数、几乎支持所有 Windows&#x2F;Office 所有版本</p><p>8、Windows 7上无需依赖.NET Framework、能够离线激活，也能连接网络服务器激活</p><p><strong>静默参数</strong></p><p>&#x2F;? 查看静默参数<br>&#x2F;smart 智能激活<br>&#x2F;dig 数字许可证激活Win10&#x2F;11<br>&#x2F;k38 激活Win10&#x2F;11至2038年<br>&#x2F;lok 添加KMS38保护<br>&#x2F;oem OEM激活Win Vista&#x2F;7&#x2F;Server<br>&#x2F;od1 OEM模式1(默认)<br>&#x2F;od2 OEM模式2<br>&#x2F;kwi 使用KMS激活Windows<br>&#x2F;kof 使用KMS激活Office<br>&#x2F;kd1 KMS模式1(默认)<br>&#x2F;kd2 KMS模式2<br>&#x2F;wxp 激活Windows XP<br>&#x2F;r2v Office R2V<br>&#x2F;ren 安装自动续期功能<br>&#x2F;unr 卸载自动续期功能<br>&#x2F;reb 重启计算机<br>&#x2F;nologo 使用静默参数时不显示logo</p><p>无人值守静默方式以数字许可永久激活系统：</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HEU_KMS_Activator.exe /kwi /dig /nologo</span><br></pre></td></tr></table></figure><blockquote><p> 注意：此激活工具Microsoft Defender会误报威胁，记得加排除!</p></blockquote><h3 id="免责声明"><a href="#免责声明" class="headerlink" title="免责声明"></a>免责声明</h3><p>本软件完全免费，仅供研究激活原理测试使用，任何个人和组织不得以任何形式进行出售，任何商业行为与我本人没有任何关系，并非我的本意。如果你想使用Windows或Office，请前往微软正规渠道购买正版授权。本程序不鼓励盗版，对于不正确的使用，请自行承担责任。如果你使用本程序，则表示你自动同意上述书面协议，因此，任何责任和后果请自负。</p>]]></content>
    
    
    <summary type="html">一款简洁高效的KMS/OEM智能激活工具，适用所有Windows、Office版本，无需联网即可一键激活，支持UEFI的KMS激活工具。</summary>
    
    
    
    <category term="Windows" scheme="https://blog.natuie.net/categories/Windows/"/>
    
    
    <category term="工具" scheme="https://blog.natuie.net/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>算法学习推荐网站或书籍 - Hello算法</title>
    <link href="https://blog.natuie.net/posts/2024/08/11/162542/"/>
    <id>https://blog.natuie.net/posts/2024/08/11/162542/</id>
    <published>2024-08-11T08:25:42.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<p><strong>《Hello 算法》</strong></p><p>动画图解、一键运行的数据结构与算法教程</p><ul><li><strong>代码仓库</strong> &gt; <a href="https://github.com/krahets/hello-algo">https://github.com/krahets/hello-algo</a></li><li><strong>在线阅读</strong> &gt; <a href="https://www.hello-algo.com/">https://www.hello-algo.com/</a></li><li><strong>下载 PDF</strong> &gt; <a href="https://github.com/krahets/hello-algo/releases">https://github.com/krahets/hello-algo/releases</a></li></ul><p>本项目旨在创建一本开源、免费、对新手友好的数据结构与算法入门教程。</p><ul><li>全书采用动画图解，内容清晰易懂、学习曲线平滑，引导初学者探索数据结构与算法的知识地图。</li><li>源代码可一键运行，帮助读者在练习中提升编程技能，了解算法工作原理和数据结构底层实现。</li><li>提倡读者互助学习，欢迎大家在评论区提出问题与分享见解，在交流讨论中共同进步。</li><li>算法源代码皆可一键运行，支持 Python、C++、Java、C#、Go、Swift、JavaScript、TypeScript、Dart、Rust、C 和 Zig 等语言。</li></ul><h2 id="内容结构"><a href="#内容结构" class="headerlink" title="内容结构"></a>内容结构</h2><p>本书的主要内容如图所示。</p><ul><li><strong>复杂度分析</strong>：数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示例等。</li><li><strong>数据结构</strong>：基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。</li><li><strong>算法</strong>：搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤和示例问题等。</li></ul><p><a href="https://www.hello-algo.com/chapter_preface/about_the_book.assets/hello_algo_mindmap.png"><img src="https://www.hello-algo.com/chapter_preface/about_the_book.assets/hello_algo_mindmap.png" alt="本书主要内容"></a></p><blockquote><p>注意：这本书不是我写的哦！作者是<a href="https://github.com/krahets"><strong>@krahets</strong></a>。</p><p>本人觉得这本书写的是很不错的，欢迎去学习。</p></blockquote>]]></content>
    
    
    <summary type="html">当我们听到“算法”这个词时，很自然地会想到数学。然而实际上，许多算法并不涉及复杂数学，而是更多地依赖基本逻辑，这些逻辑在我们的日常生活中处处可见。</summary>
    
    
    
    <category term="算法" scheme="https://blog.natuie.net/categories/%E7%AE%97%E6%B3%95/"/>
    
    
  </entry>
  
  <entry>
    <title>STM32-PWM实现呼吸灯</title>
    <link href="https://blog.natuie.net/posts/2024/08/11/160033/"/>
    <id>https://blog.natuie.net/posts/2024/08/11/160033/</id>
    <published>2024-08-11T08:00:33.000Z</published>
    <updated>2025-08-16T15:24:59.574Z</updated>
    
    <content type="html"><![CDATA[<h2 id="STM32定时器PWM概述"><a href="#STM32定时器PWM概述" class="headerlink" title="STM32定时器PWM概述"></a>STM32定时器PWM概述</h2><p>在嵌入式系统开发中，控制LED的亮度或电机的速度等模拟控制任务常常需要使用PWM（脉冲宽度调制）技术。STM32微控制器提供了强大的定时器功能，可以方便地生成PWM信号。本文将详细介绍如何在STM32上配置定时器的PWM输出。</p><h2 id="定时器与引脚映射"><a href="#定时器与引脚映射" class="headerlink" title="定时器与引脚映射"></a>定时器与引脚映射</h2><p>STM32的定时器具有多个通道，每个通道都可以输出PWM信号。但是，并非所有的GPIO引脚都可以用于所有定时器的通道。每个定时器通道通常只能映射到一组特定的引脚上，这些引脚被称为复用功能（Alternate Function，AF）引脚。</p><h3 id="如何确定引脚与定时器通道的映射关系？"><a href="#如何确定引脚与定时器通道的映射关系？" class="headerlink" title="如何确定引脚与定时器通道的映射关系？"></a>如何确定引脚与定时器通道的映射关系？</h3><ol><li><p><strong>查看数据手册</strong>：STM32的数据手册会详细列出每个定时器通道可以映射到哪些引脚。通常，这些信息会在引脚定义和复用功能章节中给出。</p></li><li><p><strong>使用STM32CubeMX工具</strong>：STM32CubeMX是一个图形化配置工具，可以用来配置STM32的外设。通过这个工具，你可以直观地选择定时器和对应的通道，</p></li></ol><h2 id="配置TIM通道的PWM输出"><a href="#配置TIM通道的PWM输出" class="headerlink" title="配置TIM通道的PWM输出"></a>配置TIM通道的PWM输出</h2><p>假设我们使用STM32F103RCT6微控制器，并希望配置TIM3的通道2输出PWM信号，因为我的LED是这个TIM通道，按自己的来更改。以下是配置过程的详细步骤：</p><h3 id="1-使能时钟"><a href="#1-使能时钟" class="headerlink" title="1. 使能时钟"></a>1. 使能时钟</h3><p>首先，需要使能定时器和GPIO端口的时钟。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); <span class="comment">// 使能TIM3时钟</span></span><br><span class="line">RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); <span class="comment">// 使能GPIOB时钟</span></span><br></pre></td></tr></table></figure><h3 id="2-GPIO配置"><a href="#2-GPIO配置" class="headerlink" title="2. GPIO配置"></a>2. GPIO配置</h3><p>接下来，配置GPIO端口的引脚为复用推挽输出模式。在这个例子中，我们使用TIM3的通道2，对应的GPIO引脚是PB5。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">GPIO_InitTypeDef GPIO_InitStructure;</span><br><span class="line">GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; <span class="comment">// PB5</span></span><br><span class="line">GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; <span class="comment">// 复用推挽输出</span></span><br><span class="line">GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; <span class="comment">// IO口速度为50MHz</span></span><br><span class="line">GPIO_Init(GPIOB, &amp;GPIO_InitStructure); <span class="comment">// 初始化GPIOB.5</span></span><br></pre></td></tr></table></figure><h3 id="3-定时器基本配置"><a href="#3-定时器基本配置" class="headerlink" title="3. 定时器基本配置"></a>3. 定时器基本配置</h3><p>在配置PWM之前，需要对定时器进行基本的配置，包括预分频器、计数模式、自动重装载值等。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;</span><br><span class="line">TIM_TimeBaseStructure.TIM_Prescaler = <span class="number">71</span>; <span class="comment">// 预分频器值</span></span><br><span class="line">TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; <span class="comment">// 向上计数模式</span></span><br><span class="line">TIM_TimeBaseStructure.TIM_Period = <span class="number">499</span>; <span class="comment">// 自动重装载值</span></span><br><span class="line">TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; <span class="comment">// 时钟分频</span></span><br><span class="line">TIM_TimeBaseStructure.TIM_RepetitionCounter = <span class="number">0</span>;</span><br><span class="line">TIM_TimeBaseInit(TIM3, &amp;TIM_TimeBaseStructure);</span><br></pre></td></tr></table></figure><h3 id="4-PWM模式配置"><a href="#4-PWM模式配置" class="headerlink" title="4. PWM模式配置"></a>4. PWM模式配置</h3><p>现在，我们可以配置定时器的PWM模式。这包括设置PWM模式、输出状态、占空比、输出极性等。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">TIM_OCInitTypeDef TIM_OCInitStructure;</span><br><span class="line">TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; <span class="comment">// PWM模式1</span></span><br><span class="line">TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; <span class="comment">// 使能输出</span></span><br><span class="line">TIM_OCInitStructure.TIM_Pulse = <span class="number">0</span>; <span class="comment">// 初始占空比</span></span><br><span class="line">TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; <span class="comment">// 输出极性高</span></span><br><span class="line">TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; <span class="comment">// 空闲状态</span></span><br><span class="line">TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; <span class="comment">// 互补空闲状态</span></span><br><span class="line">TIM_OC2Init(TIM3, &amp;TIM_OCInitStructure); <span class="comment">// 配置TIM3通道2为PWM模式</span></span><br><span class="line">TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); <span class="comment">// 使能TIM3通道2的预装载寄存器</span></span><br></pre></td></tr></table></figure><h3 id="5-启动PWM"><a href="#5-启动PWM" class="headerlink" title="5. 启动PWM"></a>5. 启动PWM</h3><p>最后，启动定时器，PWM信号就会出现在配置好的引脚上。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TIM_Cmd(TIM3, ENABLE); <span class="comment">// 使能TIM3</span></span><br></pre></td></tr></table></figure><p>注意：需要写对对应的TIM和对应的通道，不然可能无效，如果不行，可以使用<strong>STM32CubeMX工具</strong>来找。</p><h2 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;stm32f10x.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;stm32f10x_tim.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;delay.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">PWM_Init</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">/*开启时钟*/</span></span><br><span class="line">    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);          <span class="comment">//开启TIM3的时钟</span></span><br><span class="line">    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         <span class="comment">//开启GPIOB的时钟</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">/*GPIO初始化*/</span></span><br><span class="line">    GPIO_InitTypeDef GPIO_InitStructure;</span><br><span class="line">    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;</span><br><span class="line">    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                      <span class="comment">// PB5对应TIM3的通道2</span></span><br><span class="line">    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</span><br><span class="line">    GPIO_Init(GPIOB, &amp;GPIO_InitStructure);                         <span class="comment">//将PB5引脚初始化为复用推挽输出</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 定时器初始化</span></span><br><span class="line">    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;</span><br><span class="line">    TIM_TimeBaseStructure.TIM_Prescaler = <span class="number">71</span>; <span class="comment">// 预分频器</span></span><br><span class="line">    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; <span class="comment">// 向上计数模式</span></span><br><span class="line">    TIM_TimeBaseStructure.TIM_Period = <span class="number">499</span>; <span class="comment">// 自动重装载值</span></span><br><span class="line">    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; <span class="comment">// 时钟分频</span></span><br><span class="line">    TIM_TimeBaseStructure.TIM_RepetitionCounter = <span class="number">0</span>;</span><br><span class="line">    TIM_TimeBaseInit(TIM3, &amp;TIM_TimeBaseStructure);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 使能定时器3</span></span><br><span class="line">    TIM_Cmd(TIM3, ENABLE);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// PWM模式配置</span></span><br><span class="line">    TIM_OCInitTypeDef TIM_OCInitStructure;</span><br><span class="line">    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; <span class="comment">// PWM模式1</span></span><br><span class="line">    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; <span class="comment">// 使能输出</span></span><br><span class="line">    TIM_OCInitStructure.TIM_Pulse = <span class="number">0</span>; <span class="comment">// 初始占空比</span></span><br><span class="line">    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; <span class="comment">// 输出极性高</span></span><br><span class="line">    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; <span class="comment">// 互补输出极性高</span></span><br><span class="line">    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; <span class="comment">// 空闲状态</span></span><br><span class="line">    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; <span class="comment">// 互补空闲状态</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 配置TIM3通道2</span></span><br><span class="line">    TIM_OC2Init(TIM3, &amp;TIM_OCInitStructure);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 使能TIM3通道2的预装载寄存器</span></span><br><span class="line">    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">PWM_SetCompare</span><span class="params">(<span class="type">uint16_t</span> Compare)</span></span><br><span class="line">&#123;</span><br><span class="line">    TIM_SetCompare2(TIM3, Compare); <span class="comment">//设置CCR3的值</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span> &#123;</span><br><span class="line">    PWM_Init();</span><br><span class="line"><span class="type">uint16_t</span> value = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>) &#123;</span><br><span class="line"><span class="keyword">while</span>(value &lt; <span class="number">500</span>) &#123;</span><br><span class="line">value++;</span><br><span class="line"> PWM_SetCompare(value);</span><br><span class="line"> delay_ms(<span class="number">2</span>);</span><br><span class="line"> &#125;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">while</span>(value) &#123;</span><br><span class="line">value--;</span><br><span class="line"> PWM_SetCompare(value);</span><br><span class="line"> delay_ms(<span class="number">2</span>);</span><br><span class="line"> &#125;</span><br><span class="line"> delay_ms(<span class="number">200</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>通过以上步骤，您已经成功配置了STM32的定时器TIM3的通道2，使其输出PWM信号到PB5引脚。通过调整<code>TIM_OCInitStructure.TIM_Pulse</code>的值，您可以改变PWM的占空比，从而控制连接到该引脚的LED的亮度。</p>]]></content>
    
    
    <summary type="html">在嵌入式系统开发中，控制LED的亮度或电机的速度等模拟控制任务常常需要使用PWM（脉冲宽度调制）技术。STM32微控制器提供了强大的定时器功能，可以方便地生成PWM信号。本文将详细介绍如何在STM32上配置定时器的PWM输出，并解释如何将PWM信号映射到特定的引脚上。</summary>
    
    
    
    <category term="STM32" scheme="https://blog.natuie.net/categories/STM32/"/>
    
    
    <category term="PWM" scheme="https://blog.natuie.net/tags/PWM/"/>
    
    <category term="TIM" scheme="https://blog.natuie.net/tags/TIM/"/>
    
  </entry>
  
  <entry>
    <title>STM32F103RCT6-ST7789-1.3寸屏幕驱动</title>
    <link href="https://blog.natuie.net/posts/2024/08/11/144001/"/>
    <id>https://blog.natuie.net/posts/2024/08/11/144001/</id>
    <published>2024-08-11T06:40:01.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h2 id="ST7789屏幕驱动"><a href="#ST7789屏幕驱动" class="headerlink" title="ST7789屏幕驱动"></a>ST7789屏幕驱动</h2><p>在嵌入式系统开发中，显示屏幕是与用户交互的重要组成部分。ST7789是一款常用的TFT LCD驱动IC，广泛应用于各种小型显示屏幕中。本文将介绍如何为STM32F103RCT6微控制器编写ST7789 1.3寸屏幕驱动程序，并提供基本的初始化和显示功能。</p><h2 id="引脚功能"><a href="#引脚功能" class="headerlink" title="引脚功能"></a>引脚功能</h2><p>在开始编写代码之前，我们需要了解STM32F103RCT6与ST7789屏幕之间的连接方式。ST7789通常通过SPI接口与微控制器通信，同时还需要一些控制线，如复位（RST）、数据&#x2F;命令（DC）、片选（CS）等。</p><p>了解各个引脚功能之后就可以开始进行驱动屏幕显示</p><table><thead><tr><th>引脚名称</th><th>引脚功能</th></tr></thead><tbody><tr><td>VCC</td><td>电源正，3.3 - 5V（看你屏幕），需要与通信电平一致</td></tr><tr><td>GND</td><td>电源负，接地</td></tr><tr><td>CS</td><td>片选，低电平使能（本文章不接）</td></tr><tr><td>RST</td><td>复位，低电平使能</td></tr><tr><td>DC</td><td>数据&#x2F;命令选择，低电平命令，高电平数据</td></tr><tr><td>SDA</td><td>SPI数据输入端口</td></tr><tr><td>SCL</td><td>SPI时钟信号输入端口</td></tr><tr><td>BLK</td><td>背光，悬空使能接地关闭，默认上拉至3.3V（可选择不接）</td></tr></tbody></table><h2 id="引脚接线"><a href="#引脚接线" class="headerlink" title="引脚接线"></a>引脚接线</h2><table><thead><tr><th align="center">STM32F03RCT6</th><th align="center">ST7789</th></tr></thead><tbody><tr><td align="center">3V3</td><td align="center">VCC</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">CS（不接）</td><td align="center">PC0</td></tr><tr><td align="center">RST</td><td align="center">PA6</td></tr><tr><td align="center">DC</td><td align="center">PC6</td></tr><tr><td align="center">SDA</td><td align="center">PA7</td></tr><tr><td align="center">SCL</td><td align="center">PA5</td></tr><tr><td align="center">BLK（可不接）</td><td align="center">PC7</td></tr></tbody></table><blockquote><p>注意：按照自己的板子引脚来接，可能板子引脚会不一样！电源不要接反了小小烧屏幕！</p></blockquote><h2 id="我使用的开发板"><a href="#我使用的开发板" class="headerlink" title="我使用的开发板"></a>我使用的开发板</h2><p><img src="/img/post/rct6.jpg" alt="RCT6开发板"></p><h2 id="驱动移植"><a href="#驱动移植" class="headerlink" title="驱动移植"></a>驱动移植</h2><h3 id="lcd-init-h：初始化LCD头文件"><a href="#lcd-init-h：初始化LCD头文件" class="headerlink" title="lcd-init.h：初始化LCD头文件"></a>lcd-init.h：初始化LCD头文件</h3><figure class="highlight h"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> __LCD_INIT_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> __LCD_INIT_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;sys.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> USE_HORIZONTAL 0  <span class="comment">//设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏,（没啥用）</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_W 240</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_H 240</span></span><br><span class="line"><span class="comment">//-----------------LCD端口定义---------------- </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5)<span class="comment">//SCL=SCLK=SCK</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5)</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_MOSI_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7)<span class="comment">//SDA=MOSI =SDI</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_MOSI_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7)</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_RES_Clr()  GPIO_ResetBits(GPIOA,GPIO_Pin_6)<span class="comment">//RES=RST=SDO</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_RES_Set()  GPIO_SetBits(GPIOA,GPIO_Pin_6)</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_DC_Clr()   GPIO_ResetBits(GPIOC,GPIO_Pin_6)<span class="comment">//DC=RS</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_DC_Set()   GPIO_SetBits(GPIOC,GPIO_Pin_6)</span></span><br><span class="line">      </span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_CS_Clr()   GPIO_ResetBits(GPIOC,GPIO_Pin_0)<span class="comment">//CS</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_CS_Set()   GPIO_SetBits(GPIOC,GPIO_Pin_0)</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_BLK_Clr()  GPIO_ResetBits(GPIOC,GPIO_Pin_7)<span class="comment">//BLK</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LCD_BLK_Set()  GPIO_SetBits(GPIOC,GPIO_Pin_7)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_GPIO_Init</span><span class="params">(<span class="type">void</span>)</span>;<span class="comment">//初始化GPIO</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Writ_Bus</span><span class="params">(u8 dat)</span>;<span class="comment">//模拟SPI时序</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_WR_DATA8</span><span class="params">(u8 dat)</span>;<span class="comment">//写入一个字节</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_WR_DATA</span><span class="params">(u16 dat)</span>;<span class="comment">//写入两个字节</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_WR_REG</span><span class="params">(u8 dat)</span>;<span class="comment">//写入一个指令</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Address_Set</span><span class="params">(u16 x1,u16 y1,u16 x2,u16 y2)</span>;<span class="comment">//设置坐标函数</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Init</span><span class="params">(<span class="type">void</span>)</span>;<span class="comment">//LCD初始化</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure><h3 id="lcd-init-c：LCD初始化文件"><a href="#lcd-init-c：LCD初始化文件" class="headerlink" title="lcd-init.c：LCD初始化文件"></a>lcd-init.c：LCD初始化文件</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;lcd_init.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;delay.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_GPIO_Init</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">GPIO_InitTypeDef  GPIO_InitStructure;</span><br><span class="line"> RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); <span class="comment">//使能A端口时钟</span></span><br><span class="line">GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6|GPIO_Pin_7; </span><br><span class="line"> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  <span class="comment">//推挽输出</span></span><br><span class="line">GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<span class="comment">//速度50MHz</span></span><br><span class="line"> GPIO_Init(GPIOC, &amp;GPIO_InitStructure);  <span class="comment">//初始化GPIOA</span></span><br><span class="line"> GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_6|GPIO_Pin_7);</span><br><span class="line"></span><br><span class="line">GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; </span><br><span class="line"> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  <span class="comment">//推挽输出</span></span><br><span class="line">GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<span class="comment">//速度50MHz</span></span><br><span class="line"> GPIO_Init(GPIOA, &amp;GPIO_InitStructure);  <span class="comment">//初始化GPIOA</span></span><br><span class="line"> GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：LCD串行数据写入函数</span></span><br><span class="line"><span class="comment">      入口数据：dat  要写入的串行数据</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Writ_Bus</span><span class="params">(u8 dat)</span> </span><br><span class="line">&#123;</span><br><span class="line">u8 i;</span><br><span class="line">LCD_CS_Clr();</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++)</span><br><span class="line">&#123;  </span><br><span class="line">LCD_SCLK_Clr();</span><br><span class="line"><span class="keyword">if</span>(dat&amp;<span class="number">0x80</span>)</span><br><span class="line">&#123;</span><br><span class="line">   LCD_MOSI_Set();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">   LCD_MOSI_Clr();</span><br><span class="line">&#125;</span><br><span class="line">LCD_SCLK_Set();</span><br><span class="line">dat&lt;&lt;=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">  LCD_CS_Set();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：LCD写入数据</span></span><br><span class="line"><span class="comment">      入口数据：dat 写入的数据</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_WR_DATA8</span><span class="params">(u8 dat)</span></span><br><span class="line">&#123;</span><br><span class="line">LCD_Writ_Bus(dat);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：LCD写入数据</span></span><br><span class="line"><span class="comment">      入口数据：dat 写入的数据</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_WR_DATA</span><span class="params">(u16 dat)</span></span><br><span class="line">&#123;</span><br><span class="line">LCD_Writ_Bus(dat&gt;&gt;<span class="number">8</span>);</span><br><span class="line">LCD_Writ_Bus(dat);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：LCD写入命令</span></span><br><span class="line"><span class="comment">      入口数据：dat 写入的命令</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_WR_REG</span><span class="params">(u8 dat)</span></span><br><span class="line">&#123;</span><br><span class="line">LCD_DC_Clr();<span class="comment">//写命令</span></span><br><span class="line">LCD_Writ_Bus(dat);</span><br><span class="line">LCD_DC_Set();<span class="comment">//写数据</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：设置起始和结束地址</span></span><br><span class="line"><span class="comment">      入口数据：x1,x2 设置列的起始和结束地址</span></span><br><span class="line"><span class="comment">                y1,y2 设置行的起始和结束地址</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Address_Set</span><span class="params">(u16 x1,u16 y1,u16 x2,u16 y2)</span></span><br><span class="line">&#123;</span><br><span class="line">LCD_WR_REG(<span class="number">0x2a</span>);</span><br><span class="line">   LCD_WR_DATA8(x1&gt;&gt;<span class="number">8</span>);</span><br><span class="line">   LCD_WR_DATA8(x1);</span><br><span class="line">   LCD_WR_DATA8(x2&gt;&gt;<span class="number">8</span>);</span><br><span class="line">   LCD_WR_DATA8(x2);</span><br><span class="line">  </span><br><span class="line">   LCD_WR_REG(<span class="number">0x2b</span>);</span><br><span class="line">   LCD_WR_DATA8(y1&gt;&gt;<span class="number">8</span>);</span><br><span class="line">   LCD_WR_DATA8(y1);</span><br><span class="line">   LCD_WR_DATA8(y2&gt;&gt;<span class="number">8</span>);</span><br><span class="line">   LCD_WR_DATA8(y2);</span><br><span class="line"></span><br><span class="line">   LCD_WR_REG(<span class="number">0x2C</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Init</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">LCD_GPIO_Init();<span class="comment">//初始化GPIO</span></span><br><span class="line"></span><br><span class="line">LCD_RES_Clr();<span class="comment">//复位</span></span><br><span class="line">delay_ms(<span class="number">20</span>);</span><br><span class="line">LCD_RES_Set();</span><br><span class="line">delay_ms(<span class="number">20</span>);</span><br><span class="line"></span><br><span class="line">LCD_BLK_Set();<span class="comment">//打开背光</span></span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0x36</span>); </span><br><span class="line">LCD_WR_DATA8(<span class="number">0x00</span>);</span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0x3A</span>); </span><br><span class="line">LCD_WR_DATA8(<span class="number">0x05</span>);</span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xB2</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x0C</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x0C</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x00</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x33</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x33</span>);</span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xB7</span>); </span><br><span class="line">LCD_WR_DATA8(<span class="number">0x35</span>);  </span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xBB</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x19</span>);</span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xC0</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x2C</span>);</span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xC2</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x01</span>);</span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xC3</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x12</span>);   </span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xC4</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x20</span>);  </span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xC6</span>); </span><br><span class="line">LCD_WR_DATA8(<span class="number">0x0F</span>);    </span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xD0</span>); </span><br><span class="line">LCD_WR_DATA8(<span class="number">0xA4</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0xA1</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xE0</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0xD0</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x04</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x0D</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x11</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x13</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x2B</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x3F</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x54</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x4C</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x18</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x0D</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x0B</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x1F</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x23</span>);</span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0xE1</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0xD0</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x04</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x0C</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x11</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x13</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x2C</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x3F</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x44</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x51</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x2F</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x1F</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x1F</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x20</span>);</span><br><span class="line">LCD_WR_DATA8(<span class="number">0x23</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0x21</span>); </span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0x11</span>); </span><br><span class="line"><span class="comment">//Delay (120); </span></span><br><span class="line"></span><br><span class="line">LCD_WR_REG(<span class="number">0x29</span>); </span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure><h3 id="lcd-h：LCD显示实现头文件"><a href="#lcd-h：LCD显示实现头文件" class="headerlink" title="lcd.h：LCD显示实现头文件"></a>lcd.h：LCD显示实现头文件</h3><figure class="highlight h"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> __LCD_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> __LCD_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;sys.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Fill</span><span class="params">(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)</span>;<span class="comment">//指定区域填充颜色</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_DrawPoint</span><span class="params">(u16 x,u16 y,u16 color)</span>;<span class="comment">//在指定位置画一个点</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_DrawLine</span><span class="params">(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)</span>;<span class="comment">//在指定位置画一条线</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_DrawRectangle</span><span class="params">(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)</span>;<span class="comment">//在指定位置画一个矩形</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Draw_Circle</span><span class="params">(u16 x0,u16 y0,u8 r,u16 color)</span>;<span class="comment">//在指定位置画一个圆</span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span>;<span class="comment">//显示汉字串</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese12x12</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span>;<span class="comment">//显示单个12x12汉字</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese16x16</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span>;<span class="comment">//显示单个16x16汉字</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese24x24</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span>;<span class="comment">//显示单个24x24汉字</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese32x32</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span>;<span class="comment">//显示单个32x32汉字</span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChar</span><span class="params">(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)</span>;<span class="comment">//显示一个字符</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowString</span><span class="params">(u16 x,u16 y,<span class="type">const</span> u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)</span>;<span class="comment">//显示字符串</span></span><br><span class="line">u32 <span class="title function_">mypow</span><span class="params">(u8 m,u8 n)</span>;<span class="comment">//求幂</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowIntNum</span><span class="params">(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)</span>;<span class="comment">//显示整数变量</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowFloatNum1</span><span class="params">(u16 x,u16 y,<span class="type">float</span> num,u8 len,u16 fc,u16 bc,u8 sizey)</span>;<span class="comment">//显示两位小数变量</span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowPicture</span><span class="params">(u16 x,u16 y,u16 length,u16 width,<span class="type">const</span> u8 pic[])</span>;<span class="comment">//显示图片</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//画笔颜色</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_BLACK 0x0000</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_WHITE 0xFFFF</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_RED 0xF800</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_GBLUE 0X07FF</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_GREEN 0x07E0</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_BLUE 0x001F</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_CYAN 0x07FF</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_MAGENTA 0xF81F</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_YELLOW 0xFFE0</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_ORANGE 0xFD20</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_BROWN 0xBC40</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_GRAY 0x8410</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_DARK_GRAY 0x4208</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_BRRED  0XFC07 <span class="comment">//棕红色</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_DARKBLUE       0X01CF<span class="comment">//深蓝色</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_LIGHTBLUE       0X7D7C<span class="comment">//浅蓝色  </span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_GRAYBLUE        0X5458 <span class="comment">//灰蓝色</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_LIGHTGREEN      0X841F <span class="comment">//浅绿色</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_LGRAY  0XC618 <span class="comment">//浅灰色(PANNEL),窗体背景色</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_LGRAYBLUE         0XA651 <span class="comment">//浅灰蓝色(中间层颜色)</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7789_LBBLUE            0X2B12 <span class="comment">//浅棕蓝色(选择条目的反色)</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure><h3 id="lcd-c：LCD显示实现文件"><a href="#lcd-c：LCD显示实现文件" class="headerlink" title="lcd.c：LCD显示实现文件"></a>lcd.c：LCD显示实现文件</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;lcd.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;lcd_init.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;lcdfont.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;delay.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：在指定区域填充颜色</span></span><br><span class="line"><span class="comment">      入口数据：xsta,ysta   起始坐标</span></span><br><span class="line"><span class="comment">                xend,yend   终止坐标</span></span><br><span class="line"><span class="comment">color       要填充的颜色</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Fill</span><span class="params">(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)</span></span><br><span class="line">&#123;          </span><br><span class="line">u16 i,j; </span><br><span class="line">LCD_Address_Set(xsta,ysta,xend,yend);<span class="comment">//设置显示范围</span></span><br><span class="line"><span class="keyword">for</span>(i=ysta;i&lt;yend;i++)</span><br><span class="line">&#123;    </span><br><span class="line"><span class="keyword">for</span>(j=xsta;j&lt;xend;j++)</span><br><span class="line">&#123;</span><br><span class="line">LCD_WR_DATA(color);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：在指定位置画点</span></span><br><span class="line"><span class="comment">      入口数据：x,y 画点坐标</span></span><br><span class="line"><span class="comment">                color 点的颜色</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_DrawPoint</span><span class="params">(u16 x,u16 y,u16 color)</span></span><br><span class="line">&#123;</span><br><span class="line">LCD_Address_Set(x,y,x,y);<span class="comment">//设置光标位置 </span></span><br><span class="line">LCD_WR_DATA(color);</span><br><span class="line">&#125; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：画线</span></span><br><span class="line"><span class="comment">      入口数据：x1,y1   起始坐标</span></span><br><span class="line"><span class="comment">                x2,y2   终止坐标</span></span><br><span class="line"><span class="comment">                color   线的颜色</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_DrawLine</span><span class="params">(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)</span></span><br><span class="line">&#123;</span><br><span class="line">u16 t; </span><br><span class="line"><span class="type">int</span> xerr=<span class="number">0</span>,yerr=<span class="number">0</span>,delta_x,delta_y,distance;</span><br><span class="line"><span class="type">int</span> incx,incy,uRow,uCol;</span><br><span class="line">delta_x=x2-x1; <span class="comment">//计算坐标增量 </span></span><br><span class="line">delta_y=y2-y1;</span><br><span class="line">uRow=x1;<span class="comment">//画线起点坐标</span></span><br><span class="line">uCol=y1;</span><br><span class="line"><span class="keyword">if</span>(delta_x&gt;<span class="number">0</span>)incx=<span class="number">1</span>; <span class="comment">//设置单步方向 </span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (delta_x==<span class="number">0</span>)incx=<span class="number">0</span>;<span class="comment">//垂直线 </span></span><br><span class="line"><span class="keyword">else</span> &#123;incx=<span class="number">-1</span>;delta_x=-delta_x;&#125;</span><br><span class="line"><span class="keyword">if</span>(delta_y&gt;<span class="number">0</span>)incy=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (delta_y==<span class="number">0</span>)incy=<span class="number">0</span>;<span class="comment">//水平线 </span></span><br><span class="line"><span class="keyword">else</span> &#123;incy=<span class="number">-1</span>;delta_y=-delta_y;&#125;</span><br><span class="line"><span class="keyword">if</span>(delta_x&gt;delta_y)distance=delta_x; <span class="comment">//选取基本增量坐标轴 </span></span><br><span class="line"><span class="keyword">else</span> distance=delta_y;</span><br><span class="line"><span class="keyword">for</span>(t=<span class="number">0</span>;t&lt;distance+<span class="number">1</span>;t++)</span><br><span class="line">&#123;</span><br><span class="line">LCD_DrawPoint(uRow,uCol,color);<span class="comment">//画点</span></span><br><span class="line">xerr+=delta_x;</span><br><span class="line">yerr+=delta_y;</span><br><span class="line"><span class="keyword">if</span>(xerr&gt;distance)</span><br><span class="line">&#123;</span><br><span class="line">xerr-=distance;</span><br><span class="line">uRow+=incx;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(yerr&gt;distance)</span><br><span class="line">&#123;</span><br><span class="line">yerr-=distance;</span><br><span class="line">uCol+=incy;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：画矩形</span></span><br><span class="line"><span class="comment">      入口数据：x1,y1   起始坐标</span></span><br><span class="line"><span class="comment">                x2,y2   终止坐标</span></span><br><span class="line"><span class="comment">                color   矩形的颜色</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_DrawRectangle</span><span class="params">(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)</span></span><br><span class="line">&#123;</span><br><span class="line">LCD_DrawLine(x1,y1,x2,y1,color);</span><br><span class="line">LCD_DrawLine(x1,y1,x1,y2,color);</span><br><span class="line">LCD_DrawLine(x1,y2,x2,y2,color);</span><br><span class="line">LCD_DrawLine(x2,y1,x2,y2,color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：画圆</span></span><br><span class="line"><span class="comment">      入口数据：x0,y0   圆心坐标</span></span><br><span class="line"><span class="comment">                r       半径</span></span><br><span class="line"><span class="comment">                color   圆的颜色</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_Draw_Circle</span><span class="params">(u16 x0,u16 y0,u8 r,u16 color)</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> a,b;</span><br><span class="line">a=<span class="number">0</span>;b=r;  </span><br><span class="line"><span class="keyword">while</span>(a&lt;=b)</span><br><span class="line">&#123;</span><br><span class="line">LCD_DrawPoint(x0-b,y0-a,color);             <span class="comment">//3           </span></span><br><span class="line">LCD_DrawPoint(x0+b,y0-a,color);             <span class="comment">//0           </span></span><br><span class="line">LCD_DrawPoint(x0-a,y0+b,color);             <span class="comment">//1                </span></span><br><span class="line">LCD_DrawPoint(x0-a,y0-b,color);             <span class="comment">//2             </span></span><br><span class="line">LCD_DrawPoint(x0+b,y0+a,color);             <span class="comment">//4               </span></span><br><span class="line">LCD_DrawPoint(x0+a,y0-b,color);             <span class="comment">//5</span></span><br><span class="line">LCD_DrawPoint(x0+a,y0+b,color);             <span class="comment">//6 </span></span><br><span class="line">LCD_DrawPoint(x0-b,y0+a,color);             <span class="comment">//7</span></span><br><span class="line">a++;</span><br><span class="line"><span class="keyword">if</span>((a*a+b*b)&gt;(r*r))<span class="comment">//判断要画的点是否过远</span></span><br><span class="line">&#123;</span><br><span class="line">b--;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示汉字串</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                *s 要显示的汉字串</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号 可选 16 24 32</span></span><br><span class="line"><span class="comment">                mode:  0非叠加模式  1叠加模式</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">while</span>(*s!=<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(sizey==<span class="number">12</span>) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(sizey==<span class="number">16</span>) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(sizey==<span class="number">24</span>) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(sizey==<span class="number">32</span>) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span>;</span><br><span class="line">s+=<span class="number">2</span>;</span><br><span class="line">x+=sizey;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示单个12x12汉字</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                *s 要显示的汉字</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">                mode:  0非叠加模式  1叠加模式</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese12x12</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span></span><br><span class="line">&#123;</span><br><span class="line">u8 i,j,m=<span class="number">0</span>;</span><br><span class="line">u16 k;</span><br><span class="line">u16 HZnum;<span class="comment">//汉字数目</span></span><br><span class="line">u16 TypefaceNum;<span class="comment">//一个字符所占字节大小</span></span><br><span class="line">u16 x0=x;</span><br><span class="line">TypefaceNum=(sizey/<span class="number">8</span>+((sizey%<span class="number">8</span>)?<span class="number">1</span>:<span class="number">0</span>))*sizey;</span><br><span class="line">                         </span><br><span class="line">HZnum=<span class="keyword">sizeof</span>(tfont12)/<span class="keyword">sizeof</span>(typFNT_GB12);<span class="comment">//统计汉字数目</span></span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">0</span>;k&lt;HZnum;k++) </span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>((tfont12[k].Index[<span class="number">0</span>]==*(s))&amp;&amp;(tfont12[k].Index[<span class="number">1</span>]==*(s+<span class="number">1</span>)))</span><br><span class="line">&#123; </span><br><span class="line">LCD_Address_Set(x,y,x+sizey<span class="number">-1</span>,y+sizey<span class="number">-1</span>);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;TypefaceNum;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;<span class="number">8</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!mode)<span class="comment">//非叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont12[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_WR_DATA(fc);</span><br><span class="line"><span class="keyword">else</span> LCD_WR_DATA(bc);</span><br><span class="line">m++;</span><br><span class="line"><span class="keyword">if</span>(m%sizey==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">m=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span><span class="comment">//叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont12[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_DrawPoint(x,y,fc);<span class="comment">//画一个点</span></span><br><span class="line">x++;</span><br><span class="line"><span class="keyword">if</span>((x-x0)==sizey)</span><br><span class="line">&#123;</span><br><span class="line">x=x0;</span><br><span class="line">y++;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;  </span><br><span class="line"><span class="keyword">continue</span>;  <span class="comment">//查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响</span></span><br><span class="line">&#125;</span><br><span class="line">&#125; </span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示单个16x16汉字</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                *s 要显示的汉字</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">                mode:  0非叠加模式  1叠加模式</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese16x16</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span></span><br><span class="line">&#123;</span><br><span class="line">u8 i,j,m=<span class="number">0</span>;</span><br><span class="line">u16 k;</span><br><span class="line">u16 HZnum;<span class="comment">//汉字数目</span></span><br><span class="line">u16 TypefaceNum;<span class="comment">//一个字符所占字节大小</span></span><br><span class="line">u16 x0=x;</span><br><span class="line">  TypefaceNum=(sizey/<span class="number">8</span>+((sizey%<span class="number">8</span>)?<span class="number">1</span>:<span class="number">0</span>))*sizey;</span><br><span class="line">HZnum=<span class="keyword">sizeof</span>(tfont16)/<span class="keyword">sizeof</span>(typFNT_GB16);<span class="comment">//统计汉字数目</span></span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">0</span>;k&lt;HZnum;k++) </span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> ((tfont16[k].Index[<span class="number">0</span>]==*(s))&amp;&amp;(tfont16[k].Index[<span class="number">1</span>]==*(s+<span class="number">1</span>)))</span><br><span class="line">&#123; </span><br><span class="line">LCD_Address_Set(x,y,x+sizey<span class="number">-1</span>,y+sizey<span class="number">-1</span>);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;TypefaceNum;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;<span class="number">8</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!mode)<span class="comment">//非叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont16[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_WR_DATA(fc);</span><br><span class="line"><span class="keyword">else</span> LCD_WR_DATA(bc);</span><br><span class="line">m++;</span><br><span class="line"><span class="keyword">if</span>(m%sizey==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">m=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span><span class="comment">//叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont16[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_DrawPoint(x,y,fc);<span class="comment">//画一个点</span></span><br><span class="line">x++;</span><br><span class="line"><span class="keyword">if</span>((x-x0)==sizey)</span><br><span class="line">&#123;</span><br><span class="line">x=x0;</span><br><span class="line">y++;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;  </span><br><span class="line"><span class="keyword">continue</span>;  <span class="comment">//查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响</span></span><br><span class="line">&#125;</span><br><span class="line">&#125; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示单个24x24汉字</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                *s 要显示的汉字</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">                mode:  0非叠加模式  1叠加模式</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese24x24</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span></span><br><span class="line">&#123;</span><br><span class="line">u8 i,j,m=<span class="number">0</span>;</span><br><span class="line">u16 k;</span><br><span class="line">u16 HZnum;<span class="comment">//汉字数目</span></span><br><span class="line">u16 TypefaceNum;<span class="comment">//一个字符所占字节大小</span></span><br><span class="line">u16 x0=x;</span><br><span class="line">TypefaceNum=(sizey/<span class="number">8</span>+((sizey%<span class="number">8</span>)?<span class="number">1</span>:<span class="number">0</span>))*sizey;</span><br><span class="line">HZnum=<span class="keyword">sizeof</span>(tfont24)/<span class="keyword">sizeof</span>(typFNT_GB24);<span class="comment">//统计汉字数目</span></span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">0</span>;k&lt;HZnum;k++) </span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> ((tfont24[k].Index[<span class="number">0</span>]==*(s))&amp;&amp;(tfont24[k].Index[<span class="number">1</span>]==*(s+<span class="number">1</span>)))</span><br><span class="line">&#123; </span><br><span class="line">LCD_Address_Set(x,y,x+sizey<span class="number">-1</span>,y+sizey<span class="number">-1</span>);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;TypefaceNum;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;<span class="number">8</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!mode)<span class="comment">//非叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont24[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_WR_DATA(fc);</span><br><span class="line"><span class="keyword">else</span> LCD_WR_DATA(bc);</span><br><span class="line">m++;</span><br><span class="line"><span class="keyword">if</span>(m%sizey==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">m=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span><span class="comment">//叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont24[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_DrawPoint(x,y,fc);<span class="comment">//画一个点</span></span><br><span class="line">x++;</span><br><span class="line"><span class="keyword">if</span>((x-x0)==sizey)</span><br><span class="line">&#123;</span><br><span class="line">x=x0;</span><br><span class="line">y++;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;  </span><br><span class="line"><span class="keyword">continue</span>;  <span class="comment">//查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响</span></span><br><span class="line">&#125;</span><br><span class="line">&#125; </span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示单个32x32汉字</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                *s 要显示的汉字</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">                mode:  0非叠加模式  1叠加模式</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChinese32x32</span><span class="params">(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)</span></span><br><span class="line">&#123;</span><br><span class="line">u8 i,j,m=<span class="number">0</span>;</span><br><span class="line">u16 k;</span><br><span class="line">u16 HZnum;<span class="comment">//汉字数目</span></span><br><span class="line">u16 TypefaceNum;<span class="comment">//一个字符所占字节大小</span></span><br><span class="line">u16 x0=x;</span><br><span class="line">TypefaceNum=(sizey/<span class="number">8</span>+((sizey%<span class="number">8</span>)?<span class="number">1</span>:<span class="number">0</span>))*sizey;</span><br><span class="line">HZnum=<span class="keyword">sizeof</span>(tfont32)/<span class="keyword">sizeof</span>(typFNT_GB32);<span class="comment">//统计汉字数目</span></span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">0</span>;k&lt;HZnum;k++) </span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> ((tfont32[k].Index[<span class="number">0</span>]==*(s))&amp;&amp;(tfont32[k].Index[<span class="number">1</span>]==*(s+<span class="number">1</span>)))</span><br><span class="line">&#123; </span><br><span class="line">LCD_Address_Set(x,y,x+sizey<span class="number">-1</span>,y+sizey<span class="number">-1</span>);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;TypefaceNum;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;<span class="number">8</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!mode)<span class="comment">//非叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont32[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_WR_DATA(fc);</span><br><span class="line"><span class="keyword">else</span> LCD_WR_DATA(bc);</span><br><span class="line">m++;</span><br><span class="line"><span class="keyword">if</span>(m%sizey==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">m=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span><span class="comment">//叠加方式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(tfont32[k].Msk[i]&amp;(<span class="number">0x01</span>&lt;&lt;j))LCD_DrawPoint(x,y,fc);<span class="comment">//画一个点</span></span><br><span class="line">x++;</span><br><span class="line"><span class="keyword">if</span>((x-x0)==sizey)</span><br><span class="line">&#123;</span><br><span class="line">x=x0;</span><br><span class="line">y++;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;  </span><br><span class="line"><span class="keyword">continue</span>;  <span class="comment">//查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示单个字符</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                num 要显示的字符</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">                mode:  0非叠加模式  1叠加模式</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowChar</span><span class="params">(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)</span></span><br><span class="line">&#123;</span><br><span class="line">u8 temp,sizex,t,m=<span class="number">0</span>;</span><br><span class="line">u16 i,TypefaceNum;<span class="comment">//一个字符所占字节大小</span></span><br><span class="line">u16 x0=x;</span><br><span class="line">sizex=sizey/<span class="number">2</span>;</span><br><span class="line">TypefaceNum=(sizex/<span class="number">8</span>+((sizex%<span class="number">8</span>)?<span class="number">1</span>:<span class="number">0</span>))*sizey;</span><br><span class="line">num=num-<span class="string">&#x27; &#x27;</span>;    <span class="comment">//得到偏移后的值</span></span><br><span class="line">LCD_Address_Set(x,y,x+sizex<span class="number">-1</span>,y+sizey<span class="number">-1</span>);  <span class="comment">//设置光标位置 </span></span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;TypefaceNum;i++)</span><br><span class="line">&#123; </span><br><span class="line"><span class="keyword">if</span>(sizey==<span class="number">12</span>)temp=ascii_1206[num][i];       <span class="comment">//调用6x12字体</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(sizey==<span class="number">16</span>)temp=ascii_1608[num][i]; <span class="comment">//调用8x16字体</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(sizey==<span class="number">24</span>)temp=ascii_2412[num][i]; <span class="comment">//调用12x24字体</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(sizey==<span class="number">32</span>)temp=ascii_3216[num][i]; <span class="comment">//调用16x32字体</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span>;</span><br><span class="line"><span class="keyword">for</span>(t=<span class="number">0</span>;t&lt;<span class="number">8</span>;t++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!mode)<span class="comment">//非叠加模式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(temp&amp;(<span class="number">0x01</span>&lt;&lt;t))LCD_WR_DATA(fc);</span><br><span class="line"><span class="keyword">else</span> LCD_WR_DATA(bc);</span><br><span class="line">m++;</span><br><span class="line"><span class="keyword">if</span>(m%sizex==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">m=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span><span class="comment">//叠加模式</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(temp&amp;(<span class="number">0x01</span>&lt;&lt;t))LCD_DrawPoint(x,y,fc);<span class="comment">//画一个点</span></span><br><span class="line">x++;</span><br><span class="line"><span class="keyword">if</span>((x-x0)==sizex)</span><br><span class="line">&#123;</span><br><span class="line">x=x0;</span><br><span class="line">y++;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;      </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示字符串</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                *p 要显示的字符串</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">                mode:  0非叠加模式  1叠加模式</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowString</span><span class="params">(u16 x,u16 y,<span class="type">const</span> u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)</span></span><br><span class="line">&#123;         </span><br><span class="line"><span class="keyword">while</span>(*p!=<span class="string">&#x27;\0&#x27;</span>)</span><br><span class="line">&#123;       </span><br><span class="line">LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);</span><br><span class="line">x+=sizey/<span class="number">2</span>;</span><br><span class="line">p++;</span><br><span class="line">&#125;  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示数字</span></span><br><span class="line"><span class="comment">      入口数据：m底数，n指数</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line">u32 <span class="title function_">mypow</span><span class="params">(u8 m,u8 n)</span></span><br><span class="line">&#123;</span><br><span class="line">u32 result=<span class="number">1</span>; </span><br><span class="line"><span class="keyword">while</span>(n--)result*=m;</span><br><span class="line"><span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示整数变量</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                num 要显示整数变量</span></span><br><span class="line"><span class="comment">                len 要显示的位数</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowIntNum</span><span class="params">(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)</span></span><br><span class="line">&#123;         </span><br><span class="line">u8 t,temp;</span><br><span class="line">u8 enshow=<span class="number">0</span>;</span><br><span class="line">u8 sizex=sizey/<span class="number">2</span>;</span><br><span class="line"><span class="keyword">for</span>(t=<span class="number">0</span>;t&lt;len;t++)</span><br><span class="line">&#123;</span><br><span class="line">temp=(num/mypow(<span class="number">10</span>,len-t<span class="number">-1</span>))%<span class="number">10</span>;</span><br><span class="line"><span class="keyword">if</span>(enshow==<span class="number">0</span>&amp;&amp;t&lt;(len<span class="number">-1</span>))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(temp==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">LCD_ShowChar(x+t*sizex,y,<span class="string">&#x27; &#x27;</span>,fc,bc,sizey,<span class="number">0</span>);</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">&#125;<span class="keyword">else</span> enshow=<span class="number">1</span>; </span><br><span class="line">  </span><br><span class="line">&#125;</span><br><span class="line"> LCD_ShowChar(x+t*sizex,y,temp+<span class="number">48</span>,fc,bc,sizey,<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示两位小数变量</span></span><br><span class="line"><span class="comment">      入口数据：x,y显示坐标</span></span><br><span class="line"><span class="comment">                num 要显示小数变量</span></span><br><span class="line"><span class="comment">                len 要显示的位数</span></span><br><span class="line"><span class="comment">                fc 字的颜色</span></span><br><span class="line"><span class="comment">                bc 字的背景色</span></span><br><span class="line"><span class="comment">                sizey 字号</span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowFloatNum1</span><span class="params">(u16 x,u16 y,<span class="type">float</span> num,u8 len,u16 fc,u16 bc,u8 sizey)</span></span><br><span class="line">&#123;         </span><br><span class="line">u8 t,temp,sizex;</span><br><span class="line">u16 num1;</span><br><span class="line">sizex=sizey/<span class="number">2</span>;</span><br><span class="line">num1=num*<span class="number">100</span>;</span><br><span class="line"><span class="keyword">for</span>(t=<span class="number">0</span>;t&lt;len;t++)</span><br><span class="line">&#123;</span><br><span class="line">temp=(num1/mypow(<span class="number">10</span>,len-t<span class="number">-1</span>))%<span class="number">10</span>;</span><br><span class="line"><span class="keyword">if</span>(t==(len<span class="number">-2</span>))</span><br><span class="line">&#123;</span><br><span class="line">LCD_ShowChar(x+(len<span class="number">-2</span>)*sizex,y,<span class="string">&#x27;.&#x27;</span>,fc,bc,sizey,<span class="number">0</span>);</span><br><span class="line">t++;</span><br><span class="line">len+=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"> LCD_ShowChar(x+t*sizex,y,temp+<span class="number">48</span>,fc,bc,sizey,<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************************************************</span></span><br><span class="line"><span class="comment">      函数说明：显示图片</span></span><br><span class="line"><span class="comment">      入口数据：x,y起点坐标</span></span><br><span class="line"><span class="comment">                length 图片长度</span></span><br><span class="line"><span class="comment">                width  图片宽度</span></span><br><span class="line"><span class="comment">                pic[]  图片数组    </span></span><br><span class="line"><span class="comment">      返回值：  无</span></span><br><span class="line"><span class="comment">******************************************************************************/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">LCD_ShowPicture</span><span class="params">(u16 x,u16 y,u16 length,u16 width,<span class="type">const</span> u8 pic[])</span></span><br><span class="line">&#123;</span><br><span class="line">u16 i,j;</span><br><span class="line">u32 k=<span class="number">0</span>;</span><br><span class="line">LCD_Address_Set(x,y,x+length<span class="number">-1</span>,y+width<span class="number">-1</span>);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;length;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;width;j++)</span><br><span class="line">&#123;</span><br><span class="line">LCD_WR_DATA8(pic[k*<span class="number">2</span>]);</span><br><span class="line">LCD_WR_DATA8(pic[k*<span class="number">2</span>+<span class="number">1</span>]);</span><br><span class="line">k++;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="lcdfont-h：LCD字库头文件"><a href="#lcdfont-h：LCD字库头文件" class="headerlink" title="lcdfont.h：LCD字库头文件"></a>lcdfont.h：LCD字库头文件</h3><figure class="highlight h"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> __LCDFONT_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> __LCDFONT_H    </span></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">unsigned</span> <span class="type">char</span> ascii_1206[][<span class="number">12</span>]=&#123;</span><br><span class="line"></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot; &quot;,0*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;!&quot;,1*/</span></span><br><span class="line">&#123;<span class="number">0x14</span>,<span class="number">0x14</span>,<span class="number">0x0A</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&quot;&quot;,2*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x1F</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x1F</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;#&quot;,3*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x0E</span>,<span class="number">0x15</span>,<span class="number">0x05</span>,<span class="number">0x06</span>,<span class="number">0x0C</span>,<span class="number">0x14</span>,<span class="number">0x15</span>,<span class="number">0x0E</span>,<span class="number">0x04</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;$&quot;,4*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x12</span>,<span class="number">0x15</span>,<span class="number">0x0D</span>,<span class="number">0x15</span>,<span class="number">0x2E</span>,<span class="number">0x2C</span>,<span class="number">0x2A</span>,<span class="number">0x12</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;%&quot;,5*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x36</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x29</span>,<span class="number">0x16</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&amp;&quot;,6*/</span></span><br><span class="line">&#123;<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&#x27;&quot;,7*/</span></span><br><span class="line">&#123;<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;(&quot;,8*/</span></span><br><span class="line">&#123;<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;)&quot;,9*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x15</span>,<span class="number">0x0E</span>,<span class="number">0x0E</span>,<span class="number">0x15</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;*&quot;,10*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x3E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;+&quot;,11*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x01</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;,&quot;,12*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;-&quot;,13*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;.&quot;,14*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x01</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;/&quot;,15*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;0&quot;,16*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x06</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;1&quot;,17*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x01</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;2&quot;,18*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x10</span>,<span class="number">0x0C</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;3&quot;,19*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x0C</span>,<span class="number">0x0C</span>,<span class="number">0x0A</span>,<span class="number">0x09</span>,<span class="number">0x1F</span>,<span class="number">0x08</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;4&quot;,20*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x0F</span>,<span class="number">0x11</span>,<span class="number">0x10</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;5&quot;,21*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x12</span>,<span class="number">0x01</span>,<span class="number">0x0D</span>,<span class="number">0x13</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;6&quot;,22*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1E</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;7&quot;,23*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;8&quot;,24*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x19</span>,<span class="number">0x16</span>,<span class="number">0x10</span>,<span class="number">0x09</span>,<span class="number">0x06</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;9&quot;,25*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;:&quot;,26*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;;&quot;,27*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&lt;&quot;,28*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;=&quot;,29*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&gt;&quot;,30*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;?&quot;,31*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1C</span>,<span class="number">0x22</span>,<span class="number">0x29</span>,<span class="number">0x2D</span>,<span class="number">0x2D</span>,<span class="number">0x1D</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;@&quot;,32*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x0C</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x1E</span>,<span class="number">0x12</span>,<span class="number">0x33</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;A&quot;,33*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0E</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;B&quot;,34*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1E</span>,<span class="number">0x11</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;C&quot;,35*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;D&quot;,36*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x12</span>,<span class="number">0x0A</span>,<span class="number">0x0E</span>,<span class="number">0x0A</span>,<span class="number">0x02</span>,<span class="number">0x12</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;E&quot;,37*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x12</span>,<span class="number">0x0A</span>,<span class="number">0x0E</span>,<span class="number">0x0A</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x07</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;F&quot;,38*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1C</span>,<span class="number">0x12</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x39</span>,<span class="number">0x11</span>,<span class="number">0x12</span>,<span class="number">0x0C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;G&quot;,39*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x33</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x1E</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x33</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;H&quot;,40*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;I&quot;,41*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x09</span>,<span class="number">0x07</span>&#125;,<span class="comment">/*&quot;J&quot;,42*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x37</span>,<span class="number">0x12</span>,<span class="number">0x0A</span>,<span class="number">0x06</span>,<span class="number">0x0A</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x37</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;K&quot;,43*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x07</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x22</span>,<span class="number">0x3F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;L&quot;,44*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3B</span>,<span class="number">0x1B</span>,<span class="number">0x1B</span>,<span class="number">0x1B</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x35</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;M&quot;,45*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3B</span>,<span class="number">0x12</span>,<span class="number">0x16</span>,<span class="number">0x16</span>,<span class="number">0x1A</span>,<span class="number">0x1A</span>,<span class="number">0x12</span>,<span class="number">0x17</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;N&quot;,46*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;O&quot;,47*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0E</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x07</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;P&quot;,48*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x11</span>,<span class="number">0x17</span>,<span class="number">0x19</span>,<span class="number">0x0E</span>,<span class="number">0x18</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;Q&quot;,49*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0E</span>,<span class="number">0x0A</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x37</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;R&quot;,50*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1E</span>,<span class="number">0x11</span>,<span class="number">0x01</span>,<span class="number">0x06</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x11</span>,<span class="number">0x0F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;S&quot;,51*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x15</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;T&quot;,52*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x33</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;U&quot;,53*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x33</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x0C</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;V&quot;,54*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x0E</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;W&quot;,55*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1B</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x1B</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;X&quot;,56*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1B</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;Y&quot;,57*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x09</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x12</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;Z&quot;,58*/</span></span><br><span class="line">&#123;<span class="number">0x1C</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;[&quot;,59*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;\&quot;,60*/</span></span><br><span class="line">&#123;<span class="number">0x0E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;]&quot;,61*/</span></span><br><span class="line">&#123;<span class="number">0x04</span>,<span class="number">0x0A</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;^&quot;,62*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>&#125;,<span class="comment">/*&quot;_&quot;,63*/</span></span><br><span class="line">&#123;<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;`&quot;,64*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x12</span>,<span class="number">0x1C</span>,<span class="number">0x12</span>,<span class="number">0x3C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;a&quot;,65*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x0E</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;b&quot;,66*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1C</span>,<span class="number">0x12</span>,<span class="number">0x02</span>,<span class="number">0x12</span>,<span class="number">0x0C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;c&quot;,67*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x1C</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x3C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;d&quot;,68*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x12</span>,<span class="number">0x1E</span>,<span class="number">0x02</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;e&quot;,69*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x24</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1E</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;f&quot;,70*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x12</span>,<span class="number">0x0C</span>,<span class="number">0x02</span>,<span class="number">0x1C</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>&#125;,<span class="comment">/*&quot;g&quot;,71*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x0E</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x37</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;h&quot;,72*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x06</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x0E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;i&quot;,73*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x07</span>&#125;,<span class="comment">/*&quot;j&quot;,74*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x1A</span>,<span class="number">0x0A</span>,<span class="number">0x06</span>,<span class="number">0x0A</span>,<span class="number">0x13</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;k&quot;,75*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x07</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;l&quot;,76*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0F</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;m&quot;,77*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x37</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;n&quot;,78*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;o&quot;,79*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0E</span>,<span class="number">0x02</span>,<span class="number">0x07</span>&#125;,<span class="comment">/*&quot;p&quot;,80*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1C</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x1C</span>,<span class="number">0x10</span>,<span class="number">0x38</span>&#125;,<span class="comment">/*&quot;q&quot;,81*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1B</span>,<span class="number">0x06</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x07</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;r&quot;,82*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1E</span>,<span class="number">0x02</span>,<span class="number">0x0C</span>,<span class="number">0x10</span>,<span class="number">0x1E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;s&quot;,83*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1E</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;t&quot;,84*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1B</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x3C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;u&quot;,85*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1B</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;v&quot;,86*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x0E</span>,<span class="number">0x0A</span>,<span class="number">0x0A</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;w&quot;,87*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1B</span>,<span class="number">0x0A</span>,<span class="number">0x04</span>,<span class="number">0x0A</span>,<span class="number">0x1B</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;x&quot;,88*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x33</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0C</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x03</span>&#125;,<span class="comment">/*&quot;y&quot;,89*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1E</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;z&quot;,90*/</span></span><br><span class="line">&#123;<span class="number">0x18</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x0C</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x18</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&#123;&quot;,91*/</span></span><br><span class="line">&#123;<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>&#125;,<span class="comment">/*&quot;|&quot;,92*/</span></span><br><span class="line">&#123;<span class="number">0x06</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x06</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&#125;&quot;,93*/</span></span><br><span class="line">&#123;<span class="number">0x16</span>,<span class="number">0x09</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;~&quot;,94*/</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">unsigned</span> <span class="type">char</span> ascii_1608[][<span class="number">16</span>]=&#123;</span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot; &quot;,0*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;!&quot;,1*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x48</span>,<span class="number">0x6C</span>,<span class="number">0x24</span>,<span class="number">0x12</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&quot;&quot;,2*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x7F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x7F</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;#&quot;,3*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x1C</span>,<span class="number">0x2A</span>,<span class="number">0x2A</span>,<span class="number">0x0A</span>,<span class="number">0x0C</span>,<span class="number">0x18</span>,<span class="number">0x28</span>,<span class="number">0x28</span>,<span class="number">0x2A</span>,<span class="number">0x2A</span>,<span class="number">0x1C</span>,<span class="number">0x08</span>,<span class="number">0x08</span>&#125;,<span class="comment">/*&quot;$&quot;,4*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x22</span>,<span class="number">0x25</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x15</span>,<span class="number">0x2A</span>,<span class="number">0x58</span>,<span class="number">0x54</span>,<span class="number">0x54</span>,<span class="number">0x54</span>,<span class="number">0x22</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;%&quot;,5*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x0A</span>,<span class="number">0x76</span>,<span class="number">0x25</span>,<span class="number">0x29</span>,<span class="number">0x11</span>,<span class="number">0x91</span>,<span class="number">0x6E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&amp;&quot;,6*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x06</span>,<span class="number">0x06</span>,<span class="number">0x04</span>,<span class="number">0x03</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&#x27;&quot;,7*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x40</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x20</span>,<span class="number">0x40</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;(&quot;,8*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;)&quot;,9*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x6B</span>,<span class="number">0x1C</span>,<span class="number">0x1C</span>,<span class="number">0x6B</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;*&quot;,10*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x7F</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;+&quot;,11*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x06</span>,<span class="number">0x06</span>,<span class="number">0x04</span>,<span class="number">0x03</span>&#125;,<span class="comment">/*&quot;,&quot;,12*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xFE</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;-&quot;,13*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x06</span>,<span class="number">0x06</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;.&quot;,14*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x40</span>,<span class="number">0x40</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;/&quot;,15*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x24</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x24</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;0&quot;,16*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x0E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x3E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;1&quot;,17*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x42</span>,<span class="number">0x7E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;2&quot;,18*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x20</span>,<span class="number">0x18</span>,<span class="number">0x20</span>,<span class="number">0x40</span>,<span class="number">0x40</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;3&quot;,19*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x20</span>,<span class="number">0x30</span>,<span class="number">0x28</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x7E</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x78</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;4&quot;,20*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7E</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x1A</span>,<span class="number">0x26</span>,<span class="number">0x40</span>,<span class="number">0x40</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;5&quot;,21*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x38</span>,<span class="number">0x24</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x1A</span>,<span class="number">0x26</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x24</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;6&quot;,22*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7E</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;7&quot;,23*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x24</span>,<span class="number">0x18</span>,<span class="number">0x24</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;8&quot;,24*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x24</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x64</span>,<span class="number">0x58</span>,<span class="number">0x40</span>,<span class="number">0x40</span>,<span class="number">0x24</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;9&quot;,25*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;:&quot;,26*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x04</span>&#125;,<span class="comment">/*&quot;;&quot;,27*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x40</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x20</span>,<span class="number">0x40</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&lt;&quot;,28*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;=&quot;,29*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x20</span>,<span class="number">0x40</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x02</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&gt;&quot;,30*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x46</span>,<span class="number">0x40</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;?&quot;,31*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1C</span>,<span class="number">0x22</span>,<span class="number">0x5A</span>,<span class="number">0x55</span>,<span class="number">0x55</span>,<span class="number">0x55</span>,<span class="number">0x55</span>,<span class="number">0x2D</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;@&quot;,32*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x18</span>,<span class="number">0x14</span>,<span class="number">0x14</span>,<span class="number">0x24</span>,<span class="number">0x3C</span>,<span class="number">0x22</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0xE7</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;A&quot;,33*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x1E</span>,<span class="number">0x22</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;B&quot;,34*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;C&quot;,35*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1F</span>,<span class="number">0x22</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;D&quot;,36*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>,<span class="number">0x42</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x1E</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x02</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;E&quot;,37*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>,<span class="number">0x42</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x1E</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x07</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;F&quot;,38*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x01</span>,<span class="number">0x71</span>,<span class="number">0x21</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;G&quot;,39*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE7</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x7E</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0xE7</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;H&quot;,40*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x3E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;I&quot;,41*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7C</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x11</span>,<span class="number">0x0F</span>&#125;,<span class="comment">/*&quot;J&quot;,42*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x77</span>,<span class="number">0x22</span>,<span class="number">0x12</span>,<span class="number">0x0A</span>,<span class="number">0x0E</span>,<span class="number">0x0A</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x77</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;K&quot;,43*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x07</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x42</span>,<span class="number">0x7F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;L&quot;,44*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x77</span>,<span class="number">0x36</span>,<span class="number">0x36</span>,<span class="number">0x36</span>,<span class="number">0x36</span>,<span class="number">0x2A</span>,<span class="number">0x2A</span>,<span class="number">0x2A</span>,<span class="number">0x2A</span>,<span class="number">0x2A</span>,<span class="number">0x6B</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;M&quot;,45*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE3</span>,<span class="number">0x46</span>,<span class="number">0x46</span>,<span class="number">0x4A</span>,<span class="number">0x4A</span>,<span class="number">0x52</span>,<span class="number">0x52</span>,<span class="number">0x52</span>,<span class="number">0x62</span>,<span class="number">0x62</span>,<span class="number">0x47</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;N&quot;,46*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1C</span>,<span class="number">0x22</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;O&quot;,47*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3E</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x07</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;P&quot;,48*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1C</span>,<span class="number">0x22</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x41</span>,<span class="number">0x4D</span>,<span class="number">0x53</span>,<span class="number">0x32</span>,<span class="number">0x1C</span>,<span class="number">0x60</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;Q&quot;,49*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3F</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3E</span>,<span class="number">0x12</span>,<span class="number">0x12</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x42</span>,<span class="number">0xC7</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;R&quot;,50*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x18</span>,<span class="number">0x20</span>,<span class="number">0x40</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;S&quot;,51*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7F</span>,<span class="number">0x49</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;T&quot;,52*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE7</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;U&quot;,53*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE7</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x14</span>,<span class="number">0x14</span>,<span class="number">0x18</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;V&quot;,54*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x6B</span>,<span class="number">0x49</span>,<span class="number">0x49</span>,<span class="number">0x49</span>,<span class="number">0x49</span>,<span class="number">0x55</span>,<span class="number">0x55</span>,<span class="number">0x36</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;W&quot;,55*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE7</span>,<span class="number">0x42</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x42</span>,<span class="number">0xE7</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;X&quot;,56*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x77</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x14</span>,<span class="number">0x14</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x1C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;Y&quot;,57*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7E</span>,<span class="number">0x21</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;Z&quot;,58*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x78</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x78</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;[&quot;,59*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x40</span>,<span class="number">0x40</span>&#125;,<span class="comment">/*&quot;\&quot;,60*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x1E</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x1E</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;]&quot;,61*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x38</span>,<span class="number">0x44</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;^&quot;,62*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xFF</span>&#125;,<span class="comment">/*&quot;_&quot;,63*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x06</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;`&quot;,64*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x78</span>,<span class="number">0x44</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0xFC</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;a&quot;,65*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x1A</span>,<span class="number">0x26</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x26</span>,<span class="number">0x1A</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;b&quot;,66*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x38</span>,<span class="number">0x44</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x44</span>,<span class="number">0x38</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;c&quot;,67*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x60</span>,<span class="number">0x40</span>,<span class="number">0x40</span>,<span class="number">0x40</span>,<span class="number">0x78</span>,<span class="number">0x44</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x64</span>,<span class="number">0xD8</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;d&quot;,68*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x7E</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x42</span>,<span class="number">0x3C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;e&quot;,69*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xF0</span>,<span class="number">0x88</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x7E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x3E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;f&quot;,70*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7C</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x1C</span>,<span class="number">0x02</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3C</span>&#125;,<span class="comment">/*&quot;g&quot;,71*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x3A</span>,<span class="number">0x46</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0xE7</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;h&quot;,72*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x0C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x3E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;i&quot;,73*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x30</span>,<span class="number">0x30</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x38</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x22</span>,<span class="number">0x1E</span>&#125;,<span class="comment">/*&quot;j&quot;,74*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x02</span>,<span class="number">0x72</span>,<span class="number">0x12</span>,<span class="number">0x0A</span>,<span class="number">0x16</span>,<span class="number">0x12</span>,<span class="number">0x22</span>,<span class="number">0x77</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;k&quot;,75*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x3E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;l&quot;,76*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7F</span>,<span class="number">0x92</span>,<span class="number">0x92</span>,<span class="number">0x92</span>,<span class="number">0x92</span>,<span class="number">0x92</span>,<span class="number">0xB7</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;m&quot;,77*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3B</span>,<span class="number">0x46</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0xE7</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;n&quot;,78*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x3C</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x3C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;o&quot;,79*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x1B</span>,<span class="number">0x26</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x22</span>,<span class="number">0x1E</span>,<span class="number">0x02</span>,<span class="number">0x07</span>&#125;,<span class="comment">/*&quot;p&quot;,80*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x78</span>,<span class="number">0x44</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x44</span>,<span class="number">0x78</span>,<span class="number">0x40</span>,<span class="number">0xE0</span>&#125;,<span class="comment">/*&quot;q&quot;,81*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x77</span>,<span class="number">0x4C</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x04</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;r&quot;,82*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7C</span>,<span class="number">0x42</span>,<span class="number">0x02</span>,<span class="number">0x3C</span>,<span class="number">0x40</span>,<span class="number">0x42</span>,<span class="number">0x3E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;s&quot;,83*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x3E</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x30</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;t&quot;,84*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x63</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x42</span>,<span class="number">0x62</span>,<span class="number">0xDC</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;u&quot;,85*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE7</span>,<span class="number">0x42</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x14</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;v&quot;,86*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xEB</span>,<span class="number">0x49</span>,<span class="number">0x49</span>,<span class="number">0x55</span>,<span class="number">0x55</span>,<span class="number">0x22</span>,<span class="number">0x22</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;w&quot;,87*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x76</span>,<span class="number">0x24</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x18</span>,<span class="number">0x24</span>,<span class="number">0x6E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;x&quot;,88*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE7</span>,<span class="number">0x42</span>,<span class="number">0x24</span>,<span class="number">0x24</span>,<span class="number">0x14</span>,<span class="number">0x18</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x07</span>&#125;,<span class="comment">/*&quot;y&quot;,89*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x7E</span>,<span class="number">0x22</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x44</span>,<span class="number">0x7E</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;z&quot;,90*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x10</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0x20</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&#123;&quot;,91*/</span></span><br><span class="line">&#123;<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>,<span class="number">0x10</span>&#125;,<span class="comment">/*&quot;|&quot;,92*/</span></span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x06</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x08</span>,<span class="number">0x06</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;&#125;&quot;,93*/</span></span><br><span class="line">&#123;<span class="number">0x0C</span>,<span class="number">0x32</span>,<span class="number">0xC2</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot;~&quot;,94*/</span></span><br><span class="line">&#125;; </span><br><span class="line"></span><br><span class="line"><span class="comment">//节省空间 注释掉了不常用的大字字库</span></span><br><span class="line"><span class="type">const</span> <span class="type">unsigned</span> <span class="type">char</span> ascii_2412[][<span class="number">48</span>]=&#123;</span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot; &quot;,0*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;!&quot;,1*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x60,0x06,0x60,0x06,0x30,0x03,0x98,0x01,0x88,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&quot;&quot;,2*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0xFE,0x07,0xFE,0x07,0x08,0x02,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0xFE,0x07,0xFE,0x07,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;#&quot;,3*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0xF0,0x01,0x58,0x03,0x4C,0x03,0xCC,0x03,0x4C,0x00,0x58,0x00,0x70,0x00,0xE0,0x00,0xC0,0x01,0xC0,0x01,0x40,0x03,0x4C,0x03,0x5C,0x03,0x4C,0x03,0x48,0x01,0xF0,0x00,0x40,0x00,0x40,0x00,0x00,0x00&#125;,/*&quot;$&quot;,4*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x01,0x0A,0x01,0x91,0x00,0x91,0x00,0x91,0x00,0x51,0x00,0x51,0x00,0x3A,0x00,0xAE,0x03,0xA0,0x02,0x50,0x04,0x50,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0x84,0x02,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;%&quot;,5*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x2C,0x00,0x98,0x07,0x1C,0x01,0x1A,0x01,0x33,0x01,0x33,0x01,0x63,0x01,0xE3,0x00,0xC3,0x08,0xC6,0x09,0x3C,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&amp;&quot;,6*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x0C,0x00,0x1C,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&#x27;&quot;,7*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00&#125;,/*&quot;(&quot;,8*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00&#125;,/*&quot;)&quot;,9*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x00,0x40,0x00,0x46,0x0C,0x4E,0x0F,0xD0,0x01,0xF0,0x01,0x5E,0x0F,0x46,0x0C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;*&quot;,10*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x0F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;+&quot;,11*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1C,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00&#125;,/*&quot;,&quot;,12*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;-&quot;,13*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;.&quot;,14*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x00,0x00&#125;,/*&quot;/&quot;,15*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x98,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;0&quot;,16*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;1&quot;,17*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x84,0x01,0x02,0x03,0x06,0x03,0x06,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0xC0,0x00,0x60,0x00,0x20,0x00,0x10,0x00,0x08,0x02,0x04,0x02,0x06,0x02,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;2&quot;,18*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xC6,0x00,0x86,0x01,0x86,0x01,0x80,0x01,0x80,0x01,0xC0,0x00,0x70,0x00,0x80,0x01,0x00,0x01,0x00,0x03,0x00,0x03,0x06,0x03,0x06,0x03,0x86,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;3&quot;,19*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0xC0,0x01,0xA0,0x01,0xA0,0x01,0x90,0x01,0x88,0x01,0x88,0x01,0x84,0x01,0x82,0x01,0xFE,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;4&quot;,20*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xF4,0x00,0x8C,0x01,0x04,0x03,0x00,0x03,0x00,0x03,0x06,0x03,0x06,0x03,0x82,0x01,0x84,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;5&quot;,21*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x18,0x03,0x0C,0x03,0x0C,0x00,0x04,0x00,0x06,0x00,0xE6,0x01,0x16,0x03,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;6&quot;,22*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x0C,0x06,0x04,0x02,0x04,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;7&quot;,23*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x02,0x1C,0x03,0xF0,0x00,0xC8,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;8&quot;,24*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x0C,0x01,0x0C,0x03,0x06,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x8C,0x06,0x78,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x0C,0x01,0x8C,0x01,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;9&quot;,25*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;:&quot;,26*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x20,0x00,0x20,0x00&#125;,/*&quot;;&quot;,27*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&lt;&quot;,28*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;=&quot;,29*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&gt;&quot;,30*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x06,0x04,0x0C,0x04,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x07,0x80,0x01,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;?&quot;,31*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x18,0x03,0x0C,0x02,0xCC,0x05,0x64,0x05,0x66,0x05,0xA6,0x05,0xB6,0x04,0xB6,0x04,0xB6,0x04,0xB6,0x04,0xB6,0x02,0xE4,0x01,0x0C,0x04,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;@&quot;,32*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x50,0x00,0xD0,0x00,0x90,0x00,0x90,0x00,0x88,0x00,0x88,0x01,0x08,0x01,0xF8,0x01,0x04,0x03,0x04,0x03,0x04,0x02,0x02,0x02,0x02,0x06,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;A&quot;,33*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x8C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x8C,0x01,0xFC,0x00,0x0C,0x03,0x0C,0x02,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;B&quot;,34*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x03,0x0C,0x06,0x0C,0x04,0x04,0x04,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x04,0x0C,0x04,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;C&quot;,35*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x8C,0x01,0x0C,0x03,0x0C,0x03,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0x0C,0x03,0x8C,0x01,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;D&quot;,36*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x06,0x03,0x06,0x04,0x06,0x04,0x06,0x00,0x86,0x00,0x86,0x00,0xFE,0x00,0x86,0x00,0x86,0x00,0x86,0x00,0x06,0x00,0x06,0x04,0x06,0x04,0x06,0x02,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;E&quot;,37*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x06,0x03,0x06,0x04,0x06,0x04,0x06,0x00,0x86,0x00,0x86,0x00,0xFE,0x00,0x86,0x00,0x86,0x00,0x86,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;F&quot;,38*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x18,0x01,0x0C,0x02,0x0C,0x02,0x04,0x02,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xC6,0x0F,0x06,0x03,0x06,0x03,0x0C,0x03,0x0C,0x03,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;G&quot;,39*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFE,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;H&quot;,40*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;I&quot;,41*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC6,0x00,0x66,0x00,0x3C,0x00&#125;,/*&quot;J&quot;,42*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x03,0x86,0x01,0xC6,0x00,0x46,0x00,0x26,0x00,0x16,0x00,0x36,0x00,0x2E,0x00,0x6E,0x00,0x46,0x00,0xC6,0x00,0x86,0x00,0x86,0x01,0x06,0x01,0x06,0x03,0x8F,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;K&quot;,43*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x04,0x06,0x04,0x06,0x02,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;L&quot;,44*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x86,0x03,0x86,0x03,0x8E,0x03,0x8E,0x03,0x4E,0x03,0x4E,0x03,0x4A,0x03,0x5A,0x03,0x5A,0x03,0x3A,0x03,0x32,0x03,0x32,0x03,0x32,0x03,0x12,0x03,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;M&quot;,45*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0x0F,0x0C,0x02,0x1C,0x02,0x1C,0x02,0x34,0x02,0x34,0x02,0x64,0x02,0x64,0x02,0x44,0x02,0xC4,0x02,0x84,0x02,0x84,0x03,0x84,0x03,0x04,0x03,0x04,0x03,0x1F,0x02,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;N&quot;,46*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x02,0x0C,0x03,0x98,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;O&quot;,47*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x06,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x86,0x03,0xFE,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;P&quot;,48*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x76,0x06,0x4C,0x02,0xCC,0x03,0x98,0x01,0xF0,0x00,0x80,0x07,0x00,0x03,0x00,0x00&#125;,/*&quot;Q&quot;,49*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x06,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0xFE,0x00,0x46,0x00,0xC6,0x00,0x86,0x00,0x86,0x01,0x06,0x03,0x06,0x03,0x06,0x06,0x0F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;R&quot;,50*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x02,0x0C,0x03,0x06,0x02,0x06,0x02,0x06,0x00,0x0E,0x00,0x3C,0x00,0xF8,0x00,0xE0,0x03,0x80,0x03,0x00,0x07,0x02,0x06,0x02,0x06,0x06,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;S&quot;,51*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x62,0x04,0x61,0x08,0x61,0x08,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;T&quot;,52*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x07,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x18,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;U&quot;,53*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x07,0x06,0x02,0x04,0x01,0x04,0x01,0x0C,0x01,0x0C,0x01,0x88,0x00,0x88,0x00,0x98,0x00,0x98,0x00,0x50,0x00,0x50,0x00,0x70,0x00,0x30,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;V&quot;,54*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x0E,0x62,0x04,0x42,0x04,0x46,0x04,0x46,0x04,0x64,0x02,0x64,0x02,0xE4,0x02,0xE4,0x02,0x9C,0x02,0x9C,0x01,0x98,0x01,0x98,0x01,0x88,0x01,0x88,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;W&quot;,55*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x07,0x0C,0x01,0x08,0x01,0x18,0x01,0x90,0x00,0xB0,0x00,0x60,0x00,0x20,0x00,0x60,0x00,0x60,0x00,0xD0,0x00,0x90,0x00,0x88,0x01,0x08,0x01,0x04,0x03,0x8E,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;X&quot;,56*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x06,0x04,0x04,0x02,0x0C,0x02,0x08,0x01,0x18,0x01,0xB8,0x00,0xB0,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;Y&quot;,57*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0x0C,0x02,0x06,0x03,0x02,0x01,0x80,0x01,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x18,0x00,0x08,0x04,0x0C,0x04,0x04,0x02,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;Z&quot;,58*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xE0,0x03,0x00,0x00&#125;,/*&quot;[&quot;,59*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04&#125;,/*&quot;\&quot;,60*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7C,0x00,0x00,0x00&#125;,/*&quot;]&quot;,61*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;^&quot;,62*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F&#125;,/*&quot;_&quot;,63*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;`&quot;,64*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x0C,0x03,0x0C,0x03,0x00,0x03,0xE0,0x03,0x1C,0x03,0x0E,0x03,0x06,0x03,0x06,0x03,0x8E,0x0B,0x7C,0x0E,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;a&quot;,65*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xCC,0x01,0x3C,0x03,0x1C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x02,0x1C,0x03,0xE4,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;b&quot;,66*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x8C,0x01,0x8C,0x01,0x86,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x02,0x0C,0x02,0x0C,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;c&quot;,67*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x78,0x03,0x8C,0x03,0x0C,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x04,0x03,0x8C,0x07,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;d&quot;,68*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x18,0x03,0x08,0x02,0x0C,0x06,0x0C,0x06,0xFC,0x07,0x0C,0x00,0x0C,0x00,0x18,0x04,0x18,0x02,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;e&quot;,69*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x60,0x06,0x30,0x06,0x30,0x00,0x30,0x00,0xFE,0x01,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;f&quot;,70*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0xD8,0x06,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x98,0x01,0xF8,0x00,0x0C,0x00,0xFC,0x00,0xCC,0x03,0x06,0x03,0x06,0x03,0x8E,0x03,0xF8,0x00&#125;,/*&quot;g&quot;,71*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xEC,0x01,0x1C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;h&quot;,72*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;i&quot;,73*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xCC,0x00,0x7C,0x00&#125;,/*&quot;j&quot;,74*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x8C,0x03,0x8C,0x00,0x8C,0x00,0x4C,0x00,0x6C,0x00,0x5C,0x00,0x8C,0x00,0x8C,0x01,0x0C,0x01,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;k&quot;,75*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;l&quot;,76*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x07,0xEE,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;m&quot;,77*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x01,0x1C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;n&quot;,78*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;o&quot;,79*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x01,0x1C,0x03,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0x1C,0x03,0xEC,0x01,0x0C,0x00,0x0C,0x00,0x3E,0x00&#125;,/*&quot;p&quot;,80*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x8C,0x03,0x0C,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x04,0x03,0x8C,0x03,0x78,0x03,0x00,0x03,0x00,0x03,0xC0,0x07&#125;,/*&quot;q&quot;,81*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x03,0x58,0x06,0x38,0x06,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;r&quot;,82*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x1C,0x03,0x0C,0x02,0x0C,0x02,0x38,0x00,0xF0,0x00,0xC0,0x03,0x04,0x03,0x04,0x03,0x8C,0x03,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;s&quot;,83*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x30,0x00,0xFE,0x01,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x02,0x30,0x02,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;t&quot;,84*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x8E,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9C,0x07,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;u&quot;,85*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x07,0x0C,0x02,0x08,0x01,0x08,0x01,0x18,0x01,0x90,0x00,0xB0,0x00,0xB0,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;v&quot;,86*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x0E,0x62,0x04,0x46,0x04,0x64,0x02,0x64,0x02,0xEC,0x02,0x9C,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;w&quot;,87*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBC,0x07,0x18,0x01,0x10,0x01,0xB0,0x00,0x60,0x00,0x60,0x00,0xE0,0x00,0x90,0x00,0x08,0x01,0x08,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;x&quot;,88*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x07,0x08,0x01,0x08,0x01,0x08,0x01,0x90,0x00,0x90,0x00,0xB0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x20,0x00,0x24,0x00,0x1C,0x00&#125;,/*&quot;y&quot;,89*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x84,0x01,0xC4,0x00,0x44,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x18,0x02,0x08,0x02,0x0C,0x03,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;z&quot;,90*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x03,0x00,0x00&#125;,/*&quot;&#123;&quot;,91*/</span></span><br><span class="line"><span class="comment">//&#123;0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00&#125;,/*&quot;|&quot;,92*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0C,0x00,0x00,0x00&#125;,/*&quot;&#125;&quot;,93*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x1C,0x00,0x22,0x04,0xC2,0x04,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;~&quot;,94*/</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//节省空间 注释掉了不常用的大字字库</span></span><br><span class="line"><span class="type">const</span> <span class="type">unsigned</span> <span class="type">char</span> ascii_3216[][<span class="number">64</span>]=&#123;</span><br><span class="line">&#123;<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>&#125;,<span class="comment">/*&quot; &quot;,0*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;!&quot;,1*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1C,0xE0,0x1C,0xF0,0x1E,0x70,0x0E,0x38,0x07,0x18,0x03,0x08,0x01,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&quot;&quot;,2*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xFE,0x7F,0xFE,0x7F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xFE,0x7F,0xFE,0x7F,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;#&quot;,3*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0,0x07,0x60,0x19,0x10,0x31,0x18,0x31,0x18,0x39,0x18,0x39,0x38,0x01,0x70,0x01,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1D,0x00,0x39,0x00,0x31,0x1C,0x31,0x1C,0x31,0x0C,0x31,0x0C,0x11,0x18,0x0D,0xE0,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00&#125;,/*&quot;$&quot;,4*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x10,0x36,0x18,0x63,0x08,0x63,0x0C,0x63,0x04,0x63,0x04,0x63,0x02,0x63,0x02,0x63,0x01,0x36,0x1D,0x9C,0x37,0x80,0x22,0x80,0x63,0x40,0x63,0x40,0x63,0x20,0x63,0x20,0x63,0x30,0x63,0x10,0x22,0x18,0x36,0x08,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;%&quot;,5*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x00,0xCC,0x00,0x78,0x00,0x18,0x3E,0x1C,0x08,0x36,0x08,0x32,0x08,0x63,0x04,0x63,0x04,0xC3,0x04,0xC3,0x03,0x83,0x43,0x06,0x43,0x8E,0x26,0x78,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&amp;&quot;,6*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x3C,0x00,0x3C,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x0C,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&#x27;&quot;,7*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00&#125;,/*&quot;(&quot;,8*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00&#125;,/*&quot;)&quot;,9*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x03,0x00,0x01,0x1C,0x71,0x3C,0x79,0x78,0x3D,0xC0,0x07,0x00,0x01,0xC0,0x07,0x78,0x3D,0x3C,0x79,0x1C,0x71,0x00,0x01,0x80,0x03,0x80,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;*&quot;,10*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xFC,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;+&quot;,11*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x3C,0x00,0x3C,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x0C,0x00,0x06,0x00&#125;,/*&quot;,&quot;,12*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;-&quot;,13*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x3C,0x00,0x3C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;.&quot;,14*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;/&quot;,15*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x60,0x0C,0x30,0x18,0x18,0x30,0x18,0x30,0x18,0x20,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x20,0x18,0x30,0x18,0x30,0x30,0x18,0x60,0x0C,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;0&quot;,16*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x03,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;1&quot;,17*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x10,0x1C,0x08,0x18,0x04,0x30,0x04,0x30,0x0C,0x30,0x0C,0x30,0x00,0x30,0x00,0x18,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x20,0x10,0x20,0x08,0x20,0x04,0x30,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;2&quot;,18*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x0E,0x0C,0x0C,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0xC0,0x03,0x00,0x0E,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x10,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;3&quot;,19*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0E,0x00,0x0E,0x00,0x0F,0x80,0x0E,0x80,0x0E,0x40,0x0E,0x60,0x0E,0x20,0x0E,0x10,0x0E,0x10,0x0E,0x08,0x0E,0x04,0x0E,0x04,0x0E,0xFE,0x7F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;4&quot;,20*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0xF0,0x3F,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0xC8,0x07,0x28,0x0C,0x18,0x18,0x08,0x10,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x04,0x18,0x04,0x18,0x08,0x0C,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;5&quot;,21*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0xC0,0x10,0x20,0x30,0x10,0x30,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x8C,0x0F,0x6C,0x18,0x3C,0x30,0x1C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x60,0x18,0x20,0x30,0x30,0x60,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;6&quot;,22*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x1C,0x10,0x0C,0x08,0x04,0x08,0x04,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;7&quot;,23*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x30,0x0C,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x1C,0x30,0x38,0x18,0x70,0x08,0xE0,0x07,0xB0,0x07,0x18,0x0E,0x0C,0x1C,0x06,0x38,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;8&quot;,24*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x04,0x0C,0x08,0x0C,0x18,0x06,0x10,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x38,0x0C,0x3C,0x18,0x36,0xF0,0x31,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x18,0x0C,0x0C,0x0C,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;9&quot;,25*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;:&quot;,26*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x00,0x00&#125;,/*&quot;;&quot;,27*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x06,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&lt;&quot;,28*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;=&quot;,29*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;&gt;&quot;,30*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x30,0x18,0x08,0x30,0x08,0x60,0x0C,0x60,0x1C,0x60,0x1C,0x60,0x1C,0x60,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;?&quot;,31*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x60,0x18,0x10,0x30,0x18,0x20,0x0C,0x2F,0x8C,0x4D,0x86,0x4C,0xC6,0x4C,0xC6,0x4C,0x66,0x4C,0x66,0x44,0x66,0x44,0x66,0x26,0x66,0x26,0x66,0x15,0xCC,0x1C,0x0C,0x40,0x08,0x20,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;@&quot;,32*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x40,0x01,0x60,0x03,0x20,0x03,0x20,0x03,0x20,0x03,0x30,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0xF8,0x0F,0x08,0x0C,0x08,0x0C,0x08,0x0C,0x0C,0x0C,0x04,0x18,0x04,0x18,0x06,0x18,0x1F,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;A&quot;,33*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x18,0x1C,0x18,0x38,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x0C,0xF8,0x07,0x18,0x18,0x18,0x30,0x18,0x20,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x18,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;B&quot;,34*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x27,0x60,0x38,0x10,0x30,0x18,0x20,0x0C,0x40,0x0C,0x40,0x04,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x40,0x0C,0x40,0x0C,0x20,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;C&quot;,35*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x18,0x0E,0x18,0x18,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x18,0x0E,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;D&quot;,36*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x18,0x30,0x18,0x20,0x18,0x60,0x18,0x40,0x18,0x00,0x18,0x08,0x18,0x08,0x18,0x0C,0xF8,0x0F,0x18,0x0C,0x18,0x08,0x18,0x08,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x40,0x18,0x40,0x18,0x20,0x18,0x30,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;E&quot;,37*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x18,0x70,0x18,0x40,0x18,0xC0,0x18,0x80,0x18,0x00,0x18,0x10,0x18,0x10,0x18,0x18,0xF8,0x1F,0x18,0x18,0x18,0x10,0x18,0x10,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;F&quot;,38*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x13,0x70,0x1C,0x10,0x10,0x18,0x10,0x0C,0x20,0x0C,0x20,0x04,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0xFC,0x06,0x30,0x06,0x30,0x0C,0x30,0x0C,0x30,0x18,0x30,0x18,0x30,0x30,0x08,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;G&quot;,39*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7E,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0xFC,0x1F,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x3F,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;H&quot;,40*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;I&quot;,41*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x0E,0x06,0x0E,0x03,0x8E,0x01,0xFC,0x00&#125;,/*&quot;J&quot;,42*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x18,0x18,0x18,0x08,0x18,0x04,0x18,0x06,0x18,0x02,0x18,0x01,0x98,0x01,0x98,0x01,0xD8,0x01,0xB8,0x03,0x38,0x03,0x18,0x07,0x18,0x06,0x18,0x0E,0x18,0x0C,0x18,0x1C,0x18,0x18,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;K&quot;,43*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x40,0x18,0x40,0x18,0x20,0x18,0x30,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;L&quot;,44*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x36,0x74,0x32,0x64,0x32,0x64,0x32,0x64,0x32,0x64,0x31,0xC4,0x31,0xC4,0x31,0xC4,0x31,0xC4,0x30,0xC4,0x30,0x84,0x30,0x9F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;M&quot;,45*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x7C,0x1C,0x10,0x3C,0x10,0x34,0x10,0x34,0x10,0x74,0x10,0x64,0x10,0xE4,0x10,0xC4,0x10,0xC4,0x11,0x84,0x11,0x84,0x13,0x04,0x13,0x04,0x17,0x04,0x16,0x04,0x1E,0x04,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x18,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;N&quot;,46*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x30,0x0C,0x18,0x18,0x08,0x10,0x0C,0x30,0x0C,0x30,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x0C,0x20,0x0C,0x30,0x08,0x10,0x18,0x18,0x30,0x0C,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;O&quot;,47*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x18,0x18,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x18,0xF8,0x0F,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;P&quot;,48*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x30,0x0C,0x18,0x18,0x0C,0x10,0x0C,0x30,0x0C,0x20,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0xE4,0x61,0x2C,0x33,0x1C,0x32,0x18,0x16,0x30,0x0E,0xC0,0x07,0x00,0x4C,0x00,0x7C,0x00,0x38,0x00,0x00,0x00,0x00&#125;,/*&quot;Q&quot;,49*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x18,0x1C,0x18,0x38,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x0C,0xF8,0x07,0x98,0x03,0x18,0x03,0x18,0x07,0x18,0x06,0x18,0x06,0x18,0x0E,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x18,0x7E,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;R&quot;,50*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x27,0x30,0x38,0x18,0x30,0x0C,0x20,0x0C,0x20,0x0C,0x00,0x0C,0x00,0x18,0x00,0x78,0x00,0xE0,0x03,0x80,0x0F,0x00,0x1E,0x00,0x38,0x00,0x70,0x00,0x60,0x04,0x60,0x04,0x60,0x08,0x60,0x18,0x30,0x38,0x18,0xC8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;S&quot;,51*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0x8C,0x21,0x84,0x61,0x82,0x41,0x82,0x41,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;T&quot;,52*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7C,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x08,0x08,0x38,0x04,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;U&quot;,53*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0xF8,0x18,0x20,0x18,0x20,0x18,0x20,0x30,0x10,0x30,0x10,0x30,0x10,0x30,0x10,0x60,0x08,0x60,0x08,0x60,0x08,0xE0,0x0C,0xC0,0x04,0xC0,0x04,0xC0,0x04,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;V&quot;,54*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xF3,0x86,0x61,0x86,0x21,0x86,0x21,0x8C,0x21,0x0C,0x21,0x8C,0x23,0x8C,0x13,0x8C,0x13,0x8C,0x13,0x4C,0x13,0x58,0x12,0x58,0x16,0x58,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x30,0x0C,0x10,0x04,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;W&quot;,55*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x3E,0x18,0x08,0x38,0x08,0x30,0x04,0x30,0x04,0x70,0x02,0x60,0x02,0xE0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x03,0x40,0x03,0x40,0x07,0x20,0x06,0x20,0x06,0x10,0x0C,0x10,0x0C,0x08,0x18,0x08,0x18,0x3E,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;X&quot;,56*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x1C,0x10,0x18,0x10,0x18,0x08,0x30,0x08,0x30,0x0C,0x70,0x04,0x60,0x04,0x60,0x02,0xC0,0x02,0xC0,0x02,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;Y&quot;,57*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x18,0x18,0x08,0x18,0x04,0x0C,0x04,0x0E,0x00,0x06,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x60,0x00,0x70,0x00,0x30,0x00,0x38,0x20,0x18,0x20,0x1C,0x10,0x0C,0x18,0xFE,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;Z&quot;,58*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00&#125;,/*&quot;[&quot;,59*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x00&#125;,/*&quot;\&quot;,60*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0xFC,0x03,0x00,0x00,0x00,0x00&#125;,/*&quot;]&quot;,61*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0xC0,0x06,0x20,0x08,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;^&quot;,62*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF&#125;,/*&quot;_&quot;,63*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xC0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;`&quot;,64*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x18,0x06,0x0C,0x0C,0x0C,0x0C,0x00,0x0C,0x80,0x0F,0x70,0x0C,0x1C,0x0C,0x0C,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x4C,0x0C,0x4F,0xF8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;a&quot;,65*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0xD8,0x18,0x38,0x30,0x38,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x20,0x38,0x30,0x78,0x18,0xC8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;b&quot;,66*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x70,0x0C,0x18,0x18,0x18,0x18,0x0C,0x18,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x20,0x18,0x20,0x18,0x10,0x30,0x08,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;c&quot;,67*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0xE0,0x1B,0x30,0x1C,0x18,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x08,0x18,0x18,0x1C,0x30,0x7A,0xE0,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;d&quot;,68*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x30,0x0C,0x18,0x18,0x08,0x10,0x0C,0x30,0x0C,0x30,0xFC,0x3F,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x20,0x18,0x10,0x70,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;e&quot;,69*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x80,0xC3,0x80,0xC0,0xC0,0xC0,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFC,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;f&quot;,70*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x77,0x30,0x6C,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x10,0x18,0x30,0x0C,0xF0,0x07,0x18,0x00,0x18,0x00,0xF0,0x0F,0xF0,0x3F,0x08,0x70,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x38,0x38,0xE0,0x0F&#125;,/*&quot;g&quot;,71*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x98,0x0F,0xD8,0x18,0x38,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;h&quot;,72*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;i&quot;,73*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x18,0x0C,0x18,0x06,0xF0,0x03&#125;,/*&quot;j&quot;,74*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x3E,0x18,0x0C,0x18,0x06,0x18,0x03,0x18,0x01,0x98,0x01,0xD8,0x01,0x38,0x03,0x18,0x07,0x18,0x06,0x18,0x0C,0x18,0x1C,0x18,0x18,0x7E,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;k&quot;,75*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;l&quot;,76*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xEE,0x1C,0x9C,0x33,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0xDE,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;m&quot;,77*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x0F,0xD8,0x18,0x38,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;n&quot;,78*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x70,0x1C,0x10,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x30,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;o&quot;,79*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x9E,0x0F,0x58,0x18,0x38,0x30,0x18,0x20,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x38,0x30,0x78,0x18,0x98,0x07,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00&#125;,/*&quot;p&quot;,80*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x23,0x30,0x3C,0x18,0x38,0x18,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x08,0x30,0x18,0x38,0x30,0x3C,0xE0,0x33,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xFC&#125;,/*&quot;q&quot;,81*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x7E,0x3C,0x60,0x66,0x60,0x61,0xE0,0x00,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;r&quot;,82*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x27,0x30,0x38,0x18,0x30,0x18,0x20,0x18,0x00,0x70,0x00,0xE0,0x03,0x80,0x0F,0x00,0x1C,0x04,0x30,0x04,0x30,0x0C,0x30,0x1C,0x18,0xEC,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;s&quot;,83*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xE0,0x00,0xFC,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x20,0xC0,0x20,0x80,0x11,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;t&quot;,84*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x1E,0x3C,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x38,0x30,0xF4,0xE0,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;u&quot;,85*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x3C,0x18,0x18,0x18,0x08,0x38,0x08,0x30,0x04,0x30,0x04,0x70,0x02,0x60,0x02,0x60,0x02,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;v&quot;,86*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xF7,0x8E,0x63,0x0C,0x23,0x8C,0x23,0x8C,0x23,0x98,0x13,0x98,0x13,0x58,0x16,0x58,0x16,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x20,0x04,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;w&quot;,87*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3E,0x70,0x08,0x70,0x04,0xE0,0x04,0xC0,0x02,0xC0,0x01,0x80,0x03,0x80,0x03,0x40,0x07,0x60,0x06,0x20,0x0C,0x10,0x0C,0x18,0x18,0x3E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;x&quot;,88*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x18,0x18,0x18,0x08,0x30,0x08,0x30,0x08,0x30,0x04,0x60,0x04,0x60,0x04,0xC0,0x02,0xC0,0x02,0xC0,0x02,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x4C,0x00,0x3C,0x00&#125;,/*&quot;y&quot;,89*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,0x0C,0x0C,0x04,0x0E,0x04,0x06,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x20,0x30,0x20,0x38,0x30,0x1C,0x18,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;z&quot;,90*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x00&#125;,/*&quot;&#123;&quot;,91*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01&#125;,/*&quot;|&quot;,92*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0C,0x00,0x00,0x00&#125;,/*&quot;&#125;&quot;,93*/</span></span><br><span class="line"><span class="comment">//&#123;0x00,0x00,0x38,0x00,0xC4,0x00,0x86,0x40,0x02,0x61,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00&#125;,/*&quot;~&quot;,94*/</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> </span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Index[<span class="number">2</span>];</span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Msk[<span class="number">24</span>];</span><br><span class="line">&#125;typFNT_GB12; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> typFNT_GB12 tfont12[]=&#123;</span><br><span class="line"></span><br><span class="line"><span class="string">&quot;电&quot;</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0xFF</span>,<span class="number">0x01</span>,<span class="number">0x11</span>,<span class="number">0x01</span>,<span class="number">0x11</span>,<span class="number">0x01</span>,<span class="number">0xFF</span>,<span class="number">0x01</span>,<span class="number">0x11</span>,<span class="number">0x01</span>,<span class="number">0x11</span>,<span class="number">0x01</span>,</span><br><span class="line"><span class="number">0xFF</span>,<span class="number">0x01</span>,<span class="number">0x11</span>,<span class="number">0x04</span>,<span class="number">0x10</span>,<span class="number">0x04</span>,<span class="number">0xE0</span>,<span class="number">0x07</span>,<span class="comment">/*&quot;电&quot;,3*/</span></span><br><span class="line"><span class="string">&quot;子&quot;</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xFC</span>,<span class="number">0x01</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x40</span>,<span class="number">0x00</span>,<span class="number">0x20</span>,<span class="number">0x00</span>,<span class="number">0x20</span>,<span class="number">0x00</span>,<span class="number">0xFF</span>,<span class="number">0x07</span>,<span class="number">0x20</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x20</span>,<span class="number">0x00</span>,<span class="number">0x20</span>,<span class="number">0x00</span>,<span class="number">0x20</span>,<span class="number">0x00</span>,<span class="number">0x38</span>,<span class="number">0x00</span>,<span class="comment">/*&quot;子&quot;,4*/</span></span><br><span class="line"></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> </span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Index[<span class="number">2</span>];</span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Msk[<span class="number">32</span>];</span><br><span class="line">&#125;typFNT_GB16; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> typFNT_GB16 tfont16[]=&#123;</span><br><span class="line"></span><br><span class="line"><span class="string">&quot;电&quot;</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0xFC</span>,<span class="number">0x1F</span>,<span class="number">0x84</span>,<span class="number">0x10</span>,<span class="number">0x84</span>,<span class="number">0x10</span>,<span class="number">0x84</span>,<span class="number">0x10</span>,<span class="number">0xFC</span>,<span class="number">0x1F</span>,</span><br><span class="line"><span class="number">0x84</span>,<span class="number">0x10</span>,<span class="number">0x84</span>,<span class="number">0x10</span>,<span class="number">0x84</span>,<span class="number">0x10</span>,<span class="number">0xFC</span>,<span class="number">0x1F</span>,<span class="number">0x84</span>,<span class="number">0x50</span>,<span class="number">0x80</span>,<span class="number">0x40</span>,<span class="number">0x80</span>,<span class="number">0x40</span>,<span class="number">0x00</span>,<span class="number">0x7F</span>,<span class="comment">/*&quot;电&quot;,3*/</span></span><br><span class="line"></span><br><span class="line"><span class="string">&quot;子&quot;</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xFE</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0x00</span>,<span class="number">0x02</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0xFF</span>,<span class="number">0x7F</span>,</span><br><span class="line"><span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x00</span>,<span class="number">0xA0</span>,<span class="number">0x00</span>,<span class="number">0x40</span>,<span class="number">0x00</span>,<span class="comment">/*&quot;子&quot;,4*/</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> </span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Index[<span class="number">2</span>];</span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Msk[<span class="number">72</span>];</span><br><span class="line">&#125;typFNT_GB24; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> typFNT_GB24 tfont24[]=&#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="string">&quot;电&quot;</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0xF0</span>,<span class="number">0xFF</span>,<span class="number">0x0F</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,</span><br><span class="line"><span class="number">0x04</span>,<span class="number">0xF0</span>,<span class="number">0xFF</span>,<span class="number">0x07</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x04</span>,</span><br><span class="line"><span class="number">0xF0</span>,<span class="number">0xFF</span>,<span class="number">0x07</span>,<span class="number">0x10</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x20</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x18</span>,<span class="number">0x30</span>,<span class="number">0x00</span>,<span class="number">0xF0</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="comment">/*&quot;电&quot;,3*/</span></span><br><span class="line"></span><br><span class="line"><span class="string">&quot;子&quot;</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x04</span>,<span class="number">0xF0</span>,<span class="number">0xFF</span>,<span class="number">0x0F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x06</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x28</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,</span><br><span class="line"><span class="number">0x30</span>,<span class="number">0xFE</span>,<span class="number">0xFF</span>,<span class="number">0x7F</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="comment">/*&quot;子&quot;,4*/</span></span><br><span class="line"></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> </span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Index[<span class="number">2</span>];</span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> Msk[<span class="number">128</span>];</span><br><span class="line">&#125;typFNT_GB32; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> typFNT_GB32 tfont32[]=&#123;</span><br><span class="line"></span><br><span class="line"><span class="string">&quot;电&quot;</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0xE0</span>,<span class="number">0xFF</span>,<span class="number">0xFF</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,</span><br><span class="line"><span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0xE0</span>,<span class="number">0xFF</span>,<span class="number">0xFF</span>,<span class="number">0x03</span>,</span><br><span class="line"><span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,</span><br><span class="line"><span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,<span class="number">0xE0</span>,<span class="number">0xFF</span>,<span class="number">0xFF</span>,<span class="number">0x03</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x01</span>,<span class="number">0x60</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x10</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x01</span>,<span class="number">0x38</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0xFF</span>,<span class="number">0x1F</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="comment">/*&quot;电&quot;,3*/</span></span><br><span class="line"><span class="string">&quot;子&quot;</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x03</span>,</span><br><span class="line"><span class="number">0xC0</span>,<span class="number">0xFF</span>,<span class="number">0xFF</span>,<span class="number">0x07</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x07</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xC0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x60</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x18</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x0C</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x03</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x03</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x08</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x1C</span>,<span class="number">0xFC</span>,<span class="number">0xFF</span>,<span class="number">0xFF</span>,<span class="number">0x3F</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x80</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,</span><br><span class="line"><span class="number">0x00</span>,<span class="number">0xFC</span>,<span class="number">0x01</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0xE0</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x40</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="number">0x00</span>,<span class="comment">/*&quot;子&quot;,4*/</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="pic-h：图片头文件"><a href="#pic-h：图片头文件" class="headerlink" title="pic.h：图片头文件"></a>pic.h：图片头文件</h3><figure class="highlight h"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> __PIC_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> __PIC_H</span></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">unsigned</span> <span class="type">char</span> gImage_1[<span class="number">3200</span>] = &#123; <span class="comment">/* 0X10,0X10,0X00,0X28,0X00,0X28,0X01,0X1B, */</span></span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0XBE</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDE</span>,<span class="number">0XC6</span>,<span class="number">0X38</span>,<span class="number">0X8C</span>,<span class="number">0X92</span>,<span class="number">0X6B</span>,<span class="number">0X8E</span>,<span class="number">0X6B</span>,<span class="number">0X6E</span>,<span class="number">0X7C</span>,<span class="number">0X10</span>,<span class="number">0XAD</span>,<span class="number">0X96</span>,</span><br><span class="line"><span class="number">0XE7</span>,<span class="number">0X3C</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XEF</span>,<span class="number">0X5D</span>,</span><br><span class="line"><span class="number">0X9D</span>,<span class="number">0X15</span>,<span class="number">0X63</span>,<span class="number">0X4F</span>,<span class="number">0X42</span>,<span class="number">0X6C</span>,<span class="number">0X32</span>,<span class="number">0X0A</span>,<span class="number">0X29</span>,<span class="number">0X88</span>,<span class="number">0X19</span>,<span class="number">0X46</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X21</span>,<span class="number">0X45</span>,</span><br><span class="line"><span class="number">0X31</span>,<span class="number">0XE8</span>,<span class="number">0X6B</span>,<span class="number">0X8E</span>,<span class="number">0XC6</span>,<span class="number">0X38</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XA5</span>,<span class="number">0X36</span>,<span class="number">0X53</span>,<span class="number">0X10</span>,</span><br><span class="line"><span class="number">0X4B</span>,<span class="number">0X10</span>,<span class="number">0X53</span>,<span class="number">0X51</span>,<span class="number">0X4B</span>,<span class="number">0X0F</span>,<span class="number">0X3A</span>,<span class="number">0X6C</span>,<span class="number">0X31</span>,<span class="number">0XE9</span>,<span class="number">0X21</span>,<span class="number">0X67</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,</span><br><span class="line"><span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X52</span>,<span class="number">0XCB</span>,<span class="number">0XD6</span>,<span class="number">0X9A</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XE7</span>,<span class="number">0X3C</span>,<span class="number">0X63</span>,<span class="number">0X70</span>,<span class="number">0X63</span>,<span class="number">0XB3</span>,<span class="number">0X7C</span>,<span class="number">0XB8</span>,</span><br><span class="line"><span class="number">0X63</span>,<span class="number">0XF5</span>,<span class="number">0X43</span>,<span class="number">0X11</span>,<span class="number">0X32</span>,<span class="number">0X4D</span>,<span class="number">0X29</span>,<span class="number">0XEA</span>,<span class="number">0X21</span>,<span class="number">0X88</span>,<span class="number">0X19</span>,<span class="number">0X26</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,</span><br><span class="line"><span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X00</span>,<span class="number">0X83</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X8C</span>,<span class="number">0X72</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDE</span>,<span class="number">0XDB</span>,<span class="number">0X3A</span>,<span class="number">0X4B</span>,<span class="number">0X42</span>,<span class="number">0XF0</span>,<span class="number">0X6C</span>,<span class="number">0X35</span>,<span class="number">0X4B</span>,<span class="number">0X54</span>,</span><br><span class="line"><span class="number">0X32</span>,<span class="number">0XB1</span>,<span class="number">0X2A</span>,<span class="number">0X2E</span>,<span class="number">0X21</span>,<span class="number">0XEB</span>,<span class="number">0X21</span>,<span class="number">0XA9</span>,<span class="number">0X19</span>,<span class="number">0X67</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X00</span>,<span class="number">0X42</span>,<span class="number">0X73</span>,<span class="number">0XAF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XEF</span>,<span class="number">0X5D</span>,<span class="number">0X32</span>,<span class="number">0X09</span>,<span class="number">0X32</span>,<span class="number">0X4C</span>,<span class="number">0X4B</span>,<span class="number">0X10</span>,<span class="number">0X32</span>,<span class="number">0X8F</span>,<span class="number">0X2A</span>,<span class="number">0X4F</span>,</span><br><span class="line"><span class="number">0X2A</span>,<span class="number">0X2E</span>,<span class="number">0X19</span>,<span class="number">0XCC</span>,<span class="number">0X19</span>,<span class="number">0X89</span>,<span class="number">0X21</span>,<span class="number">0X89</span>,<span class="number">0X19</span>,<span class="number">0X47</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X00</span>,<span class="number">0X42</span>,<span class="number">0X84</span>,<span class="number">0X31</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X52</span>,<span class="number">0XEC</span>,<span class="number">0X19</span>,<span class="number">0X47</span>,<span class="number">0X32</span>,<span class="number">0X4C</span>,<span class="number">0X2A</span>,<span class="number">0X0B</span>,<span class="number">0X21</span>,<span class="number">0XEC</span>,<span class="number">0X21</span>,<span class="number">0XEC</span>,</span><br><span class="line"><span class="number">0X22</span>,<span class="number">0X0C</span>,<span class="number">0X5B</span>,<span class="number">0X91</span>,<span class="number">0X4A</span>,<span class="number">0XEE</span>,<span class="number">0X11</span>,<span class="number">0X06</span>,<span class="number">0X19</span>,<span class="number">0X26</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,</span><br><span class="line"><span class="number">0X29</span>,<span class="number">0XA7</span>,<span class="number">0X21</span>,<span class="number">0X66</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X00</span>,<span class="number">0X82</span>,</span><br><span class="line"><span class="number">0XBD</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XA5</span>,<span class="number">0X35</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X21</span>,<span class="number">0X88</span>,<span class="number">0X21</span>,<span class="number">0X88</span>,<span class="number">0X21</span>,<span class="number">0X89</span>,<span class="number">0X21</span>,<span class="number">0XAA</span>,<span class="number">0X21</span>,<span class="number">0X8A</span>,</span><br><span class="line"><span class="number">0X42</span>,<span class="number">0X6B</span>,<span class="number">0X8C</span>,<span class="number">0X71</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X8C</span>,<span class="number">0X72</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X08</span>,<span class="number">0XC4</span>,<span class="number">0X42</span>,<span class="number">0X29</span>,</span><br><span class="line"><span class="number">0XDE</span>,<span class="number">0XFB</span>,<span class="number">0XEF</span>,<span class="number">0X5D</span>,<span class="number">0X5A</span>,<span class="number">0XEC</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,</span><br><span class="line"><span class="number">0X31</span>,<span class="number">0XE8</span>,<span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XF7</span>,<span class="number">0XBE</span>,<span class="number">0X31</span>,<span class="number">0XC7</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X19</span>,<span class="number">0X26</span>,<span class="number">0X19</span>,<span class="number">0X47</span>,<span class="number">0X19</span>,<span class="number">0X47</span>,<span class="number">0X29</span>,<span class="number">0XA8</span>,</span><br><span class="line"><span class="number">0X52</span>,<span class="number">0X8A</span>,<span class="number">0X4A</span>,<span class="number">0X28</span>,<span class="number">0XAD</span>,<span class="number">0X55</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X31</span>,<span class="number">0XE8</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X6B</span>,<span class="number">0X4D</span>,</span><br><span class="line"><span class="number">0X6B</span>,<span class="number">0X4D</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XEF</span>,<span class="number">0X7D</span>,<span class="number">0X21</span>,<span class="number">0X45</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0XAD</span>,<span class="number">0X76</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XB5</span>,<span class="number">0X96</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X08</span>,<span class="number">0XC4</span>,<span class="number">0X4A</span>,<span class="number">0X8B</span>,</span><br><span class="line"><span class="number">0XB5</span>,<span class="number">0XB6</span>,<span class="number">0XEF</span>,<span class="number">0X5D</span>,<span class="number">0XBD</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X6B</span>,<span class="number">0X8E</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X42</span>,<span class="number">0X29</span>,<span class="number">0X5A</span>,<span class="number">0XAA</span>,</span><br><span class="line"><span class="number">0X42</span>,<span class="number">0X08</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X52</span>,<span class="number">0XCC</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X52</span>,<span class="number">0XAD</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XE7</span>,<span class="number">0X1C</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0X63</span>,<span class="number">0X4E</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X63</span>,<span class="number">0X8E</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X73</span>,<span class="number">0XCF</span>,<span class="number">0X00</span>,<span class="number">0X01</span>,<span class="number">0X9C</span>,<span class="number">0XF3</span>,<span class="number">0X63</span>,<span class="number">0X2C</span>,</span><br><span class="line"><span class="number">0XB5</span>,<span class="number">0X96</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X5B</span>,<span class="number">0X2D</span>,<span class="number">0X00</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X21</span>,<span class="number">0X67</span>,<span class="number">0XEF</span>,<span class="number">0X3D</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XBD</span>,<span class="number">0XF8</span>,<span class="number">0XB5</span>,<span class="number">0XB7</span>,<span class="number">0XEF</span>,<span class="number">0X9E</span>,<span class="number">0X52</span>,<span class="number">0XCB</span>,<span class="number">0X94</span>,<span class="number">0XB3</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDF</span>,</span><br><span class="line"><span class="number">0X31</span>,<span class="number">0XE8</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X42</span>,<span class="number">0X49</span>,</span><br><span class="line"><span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X4A</span>,<span class="number">0X6A</span>,<span class="number">0X00</span>,<span class="number">0X01</span>,<span class="number">0X84</span>,<span class="number">0X72</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XEF</span>,<span class="number">0XDF</span>,<span class="number">0X3A</span>,<span class="number">0X09</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0XBE</span>,<span class="number">0X18</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0X7B</span>,<span class="number">0XF0</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X31</span>,<span class="number">0XE8</span>,<span class="number">0X31</span>,<span class="number">0XC7</span>,<span class="number">0X00</span>,<span class="number">0X41</span>,<span class="number">0XA5</span>,<span class="number">0X35</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XEF</span>,<span class="number">0X5D</span>,</span><br><span class="line"><span class="number">0X21</span>,<span class="number">0X46</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,</span><br><span class="line"><span class="number">0X9D</span>,<span class="number">0X76</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XAD</span>,<span class="number">0XB7</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X31</span>,<span class="number">0XC7</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,</span><br><span class="line"><span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XA5</span>,<span class="number">0X76</span>,<span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0XA5</span>,<span class="number">0X35</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XDE</span>,<span class="number">0XDB</span>,<span class="number">0X29</span>,<span class="number">0XA7</span>,<span class="number">0X00</span>,<span class="number">0X83</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0XE7</span>,<span class="number">0X1C</span>,<span class="number">0XEF</span>,<span class="number">0X9E</span>,</span><br><span class="line"><span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X08</span>,<span class="number">0XC4</span>,</span><br><span class="line"><span class="number">0X10</span>,<span class="number">0XE5</span>,<span class="number">0X6B</span>,<span class="number">0XD1</span>,<span class="number">0X6B</span>,<span class="number">0XD1</span>,<span class="number">0X08</span>,<span class="number">0XC5</span>,<span class="number">0X00</span>,<span class="number">0X64</span>,<span class="number">0X08</span>,<span class="number">0XA5</span>,<span class="number">0X00</span>,<span class="number">0X43</span>,<span class="number">0X32</span>,<span class="number">0X2B</span>,</span><br><span class="line"><span class="number">0X9D</span>,<span class="number">0X77</span>,<span class="number">0X84</span>,<span class="number">0XB3</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,</span><br><span class="line"><span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X09</span>,<span class="number">0X26</span>,<span class="number">0X9D</span>,<span class="number">0X35</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X73</span>,<span class="number">0XAF</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X00</span>,<span class="number">0X82</span>,<span class="number">0X5B</span>,<span class="number">0X0D</span>,<span class="number">0X9B</span>,<span class="number">0X8E</span>,</span><br><span class="line"><span class="number">0X10</span>,<span class="number">0X62</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X00</span>,<span class="number">0X85</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,</span><br><span class="line"><span class="number">0X39</span>,<span class="number">0XC4</span>,<span class="number">0X5A</span>,<span class="number">0X81</span>,<span class="number">0X7B</span>,<span class="number">0X40</span>,<span class="number">0X9C</span>,<span class="number">0X22</span>,<span class="number">0XAC</span>,<span class="number">0X43</span>,<span class="number">0XA4</span>,<span class="number">0X03</span>,<span class="number">0X9B</span>,<span class="number">0X83</span>,<span class="number">0X72</span>,<span class="number">0X82</span>,</span><br><span class="line"><span class="number">0X49</span>,<span class="number">0X82</span>,<span class="number">0X18</span>,<span class="number">0XC2</span>,<span class="number">0X00</span>,<span class="number">0XA4</span>,<span class="number">0X00</span>,<span class="number">0XC5</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,</span><br><span class="line"><span class="number">0X19</span>,<span class="number">0X47</span>,<span class="number">0X11</span>,<span class="number">0X67</span>,<span class="number">0X5A</span>,<span class="number">0XEC</span>,<span class="number">0XFF</span>,<span class="number">0XBE</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XDE</span>,<span class="number">0XDB</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X18</span>,<span class="number">0XA4</span>,<span class="number">0XC0</span>,<span class="number">0X01</span>,</span><br><span class="line"><span class="number">0X88</span>,<span class="number">0X83</span>,<span class="number">0X00</span>,<span class="number">0XE4</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X08</span>,<span class="number">0XC5</span>,<span class="number">0X21</span>,<span class="number">0X44</span>,<span class="number">0X83</span>,<span class="number">0X43</span>,<span class="number">0XD5</span>,<span class="number">0X23</span>,</span><br><span class="line"><span class="number">0XFE</span>,<span class="number">0X42</span>,<span class="number">0XFE</span>,<span class="number">0XE4</span>,<span class="number">0XFF</span>,<span class="number">0X27</span>,<span class="number">0XFF</span>,<span class="number">0X07</span>,<span class="number">0XFE</span>,<span class="number">0XA4</span>,<span class="number">0XFE</span>,<span class="number">0X64</span>,<span class="number">0XFE</span>,<span class="number">0X03</span>,<span class="number">0XFD</span>,<span class="number">0XA3</span>,</span><br><span class="line"><span class="number">0XFC</span>,<span class="number">0XE2</span>,<span class="number">0XEC</span>,<span class="number">0X42</span>,<span class="number">0XB3</span>,<span class="number">0X83</span>,<span class="number">0X62</span>,<span class="number">0X24</span>,<span class="number">0X10</span>,<span class="number">0XE5</span>,<span class="number">0X08</span>,<span class="number">0XC4</span>,<span class="number">0X19</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X26</span>,</span><br><span class="line"><span class="number">0X19</span>,<span class="number">0XA8</span>,<span class="number">0X21</span>,<span class="number">0X87</span>,<span class="number">0X90</span>,<span class="number">0X00</span>,<span class="number">0XBC</span>,<span class="number">0XD3</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X7C</span>,<span class="number">0X10</span>,<span class="number">0X00</span>,<span class="number">0X42</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X28</span>,<span class="number">0X83</span>,<span class="number">0XD0</span>,<span class="number">0X01</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X44</span>,<span class="number">0X48</span>,<span class="number">0XA3</span>,<span class="number">0X00</span>,<span class="number">0XE4</span>,<span class="number">0X08</span>,<span class="number">0XC5</span>,<span class="number">0X5A</span>,<span class="number">0X44</span>,<span class="number">0XED</span>,<span class="number">0X02</span>,<span class="number">0XFD</span>,<span class="number">0XE2</span>,<span class="number">0XFE</span>,<span class="number">0X02</span>,</span><br><span class="line"><span class="number">0XFE</span>,<span class="number">0X66</span>,<span class="number">0XFF</span>,<span class="number">0X74</span>,<span class="number">0XFF</span>,<span class="number">0XB8</span>,<span class="number">0XFF</span>,<span class="number">0X73</span>,<span class="number">0XF6</span>,<span class="number">0XE7</span>,<span class="number">0XF6</span>,<span class="number">0XA6</span>,<span class="number">0XF6</span>,<span class="number">0X45</span>,<span class="number">0XF5</span>,<span class="number">0XA4</span>,</span><br><span class="line"><span class="number">0XFC</span>,<span class="number">0XC3</span>,<span class="number">0XFC</span>,<span class="number">0X62</span>,<span class="number">0XFC</span>,<span class="number">0XC2</span>,<span class="number">0XFC</span>,<span class="number">0XC2</span>,<span class="number">0XCB</span>,<span class="number">0XE3</span>,<span class="number">0X49</span>,<span class="number">0XC4</span>,<span class="number">0X11</span>,<span class="number">0X06</span>,<span class="number">0X19</span>,<span class="number">0X88</span>,</span><br><span class="line"><span class="number">0X01</span>,<span class="number">0X87</span>,<span class="number">0X90</span>,<span class="number">0XA4</span>,<span class="number">0XF8</span>,<span class="number">0X01</span>,<span class="number">0X9A</span>,<span class="number">0XEC</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0XBE</span>,<span class="number">0X31</span>,<span class="number">0XE8</span>,<span class="number">0X00</span>,<span class="number">0X83</span>,<span class="number">0X09</span>,<span class="number">0X05</span>,<span class="number">0X40</span>,<span class="number">0X82</span>,<span class="number">0XC0</span>,<span class="number">0X01</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XF0</span>,<span class="number">0X85</span>,<span class="number">0X48</span>,<span class="number">0XA3</span>,<span class="number">0X00</span>,<span class="number">0XA4</span>,<span class="number">0X5A</span>,<span class="number">0X44</span>,<span class="number">0XFD</span>,<span class="number">0X02</span>,<span class="number">0XCC</span>,<span class="number">0X23</span>,<span class="number">0XDC</span>,<span class="number">0XC2</span>,</span><br><span class="line"><span class="number">0XFE</span>,<span class="number">0X04</span>,<span class="number">0XFE</span>,<span class="number">0X28</span>,<span class="number">0XF6</span>,<span class="number">0X48</span>,<span class="number">0XF6</span>,<span class="number">0X46</span>,<span class="number">0XF6</span>,<span class="number">0X24</span>,<span class="number">0XF5</span>,<span class="number">0XE4</span>,<span class="number">0XFD</span>,<span class="number">0X64</span>,<span class="number">0XFC</span>,<span class="number">0XE3</span>,</span><br><span class="line"><span class="number">0XFC</span>,<span class="number">0X62</span>,<span class="number">0XFC</span>,<span class="number">0XC2</span>,<span class="number">0XE4</span>,<span class="number">0X02</span>,<span class="number">0XDC</span>,<span class="number">0X02</span>,<span class="number">0XFC</span>,<span class="number">0XE2</span>,<span class="number">0X7A</span>,<span class="number">0XA4</span>,<span class="number">0X01</span>,<span class="number">0X48</span>,<span class="number">0X01</span>,<span class="number">0X67</span>,</span><br><span class="line"><span class="number">0X78</span>,<span class="number">0XC4</span>,<span class="number">0XF8</span>,<span class="number">0X24</span>,<span class="number">0XF8</span>,<span class="number">0X02</span>,<span class="number">0XB0</span>,<span class="number">0X84</span>,<span class="number">0XE7</span>,<span class="number">0X7D</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDE</span>,<span class="number">0XDB</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X00</span>,<span class="number">0XA3</span>,<span class="number">0X38</span>,<span class="number">0XC4</span>,<span class="number">0XE0</span>,<span class="number">0X02</span>,</span><br><span class="line"><span class="number">0XD8</span>,<span class="number">0X22</span>,<span class="number">0XF8</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0XA6</span>,<span class="number">0X78</span>,<span class="number">0XA4</span>,<span class="number">0X00</span>,<span class="number">0X63</span>,<span class="number">0X21</span>,<span class="number">0X43</span>,<span class="number">0X72</span>,<span class="number">0X83</span>,<span class="number">0X39</span>,<span class="number">0X83</span>,</span><br><span class="line"><span class="number">0X9B</span>,<span class="number">0X82</span>,<span class="number">0XF5</span>,<span class="number">0X21</span>,<span class="number">0XFD</span>,<span class="number">0X61</span>,<span class="number">0XFD</span>,<span class="number">0X22</span>,<span class="number">0XFC</span>,<span class="number">0XE2</span>,<span class="number">0XFC</span>,<span class="number">0XA2</span>,<span class="number">0XFC</span>,<span class="number">0X42</span>,<span class="number">0XFC</span>,<span class="number">0X42</span>,</span><br><span class="line"><span class="number">0XFC</span>,<span class="number">0X42</span>,<span class="number">0XAB</span>,<span class="number">0X22</span>,<span class="number">0X41</span>,<span class="number">0X83</span>,<span class="number">0X92</span>,<span class="number">0XC3</span>,<span class="number">0X52</span>,<span class="number">0X04</span>,<span class="number">0X01</span>,<span class="number">0X26</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X98</span>,<span class="number">0XA4</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XF8</span>,<span class="number">0X02</span>,<span class="number">0XD0</span>,<span class="number">0XA4</span>,<span class="number">0XEF</span>,<span class="number">0X9E</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XD6</span>,<span class="number">0X9A</span>,<span class="number">0X29</span>,<span class="number">0X87</span>,<span class="number">0X00</span>,<span class="number">0XA5</span>,<span class="number">0XB8</span>,<span class="number">0X43</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X22</span>,<span class="number">0XE0</span>,<span class="number">0X23</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF8</span>,<span class="number">0XE8</span>,<span class="number">0XC9</span>,<span class="number">0X07</span>,<span class="number">0X48</span>,<span class="number">0X83</span>,<span class="number">0X00</span>,<span class="number">0X42</span>,<span class="number">0X00</span>,<span class="number">0XA3</span>,</span><br><span class="line"><span class="number">0X00</span>,<span class="number">0X84</span>,<span class="number">0X29</span>,<span class="number">0X63</span>,<span class="number">0X7A</span>,<span class="number">0XA2</span>,<span class="number">0XB3</span>,<span class="number">0X62</span>,<span class="number">0XCB</span>,<span class="number">0XA2</span>,<span class="number">0XD3</span>,<span class="number">0X62</span>,<span class="number">0XBB</span>,<span class="number">0X02</span>,<span class="number">0X8A</span>,<span class="number">0X82</span>,</span><br><span class="line"><span class="number">0X39</span>,<span class="number">0X83</span>,<span class="number">0X00</span>,<span class="number">0XA4</span>,<span class="number">0X00</span>,<span class="number">0XE5</span>,<span class="number">0X00</span>,<span class="number">0XE5</span>,<span class="number">0X08</span>,<span class="number">0XE5</span>,<span class="number">0X60</span>,<span class="number">0XC4</span>,<span class="number">0XD8</span>,<span class="number">0X64</span>,<span class="number">0XF8</span>,<span class="number">0X44</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X24</span>,<span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XF8</span>,<span class="number">0X02</span>,<span class="number">0X88</span>,<span class="number">0X83</span>,<span class="number">0XC6</span>,<span class="number">0XDB</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XE7</span>,<span class="number">0X3D</span>,<span class="number">0X5B</span>,<span class="number">0X50</span>,<span class="number">0X31</span>,<span class="number">0X08</span>,</span><br><span class="line"><span class="number">0XE8</span>,<span class="number">0X23</span>,<span class="number">0XF8</span>,<span class="number">0X43</span>,<span class="number">0XF0</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF9</span>,<span class="number">0X09</span>,<span class="number">0XF9</span>,<span class="number">0XAB</span>,<span class="number">0XD1</span>,<span class="number">0X89</span>,<span class="number">0X89</span>,<span class="number">0X06</span>,</span><br><span class="line"><span class="number">0X48</span>,<span class="number">0XA3</span>,<span class="number">0X18</span>,<span class="number">0X42</span>,<span class="number">0X00</span>,<span class="number">0X02</span>,<span class="number">0X00</span>,<span class="number">0X42</span>,<span class="number">0X00</span>,<span class="number">0X61</span>,<span class="number">0X00</span>,<span class="number">0X82</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,</span><br><span class="line"><span class="number">0X00</span>,<span class="number">0X83</span>,<span class="number">0X20</span>,<span class="number">0XA3</span>,<span class="number">0X50</span>,<span class="number">0XC4</span>,<span class="number">0X88</span>,<span class="number">0XA5</span>,<span class="number">0XD8</span>,<span class="number">0X85</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF8</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0X44</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XD0</span>,<span class="number">0X03</span>,<span class="number">0X10</span>,<span class="number">0X82</span>,<span class="number">0X29</span>,<span class="number">0XC7</span>,<span class="number">0XEF</span>,<span class="number">0X5D</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X32</span>,<span class="number">0X6C</span>,</span><br><span class="line"><span class="number">0X38</span>,<span class="number">0XA5</span>,<span class="number">0XD8</span>,<span class="number">0X02</span>,<span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF8</span>,<span class="number">0X66</span>,<span class="number">0XF8</span>,<span class="number">0XA7</span>,<span class="number">0XF9</span>,<span class="number">0X4A</span>,<span class="number">0XFA</span>,<span class="number">0X0C</span>,</span><br><span class="line"><span class="number">0XFA</span>,<span class="number">0X4D</span>,<span class="number">0XEA</span>,<span class="number">0X4C</span>,<span class="number">0XD2</span>,<span class="number">0X0B</span>,<span class="number">0XB9</span>,<span class="number">0XA9</span>,<span class="number">0XB1</span>,<span class="number">0X68</span>,<span class="number">0XA9</span>,<span class="number">0X47</span>,<span class="number">0XB1</span>,<span class="number">0X27</span>,<span class="number">0XB9</span>,<span class="number">0X07</span>,</span><br><span class="line"><span class="number">0XD1</span>,<span class="number">0X07</span>,<span class="number">0XE8</span>,<span class="number">0XE7</span>,<span class="number">0XF8</span>,<span class="number">0XC7</span>,<span class="number">0XF8</span>,<span class="number">0XA7</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF8</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0X23</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X03</span>,<span class="number">0XD0</span>,<span class="number">0X02</span>,<span class="number">0X28</span>,<span class="number">0XA3</span>,<span class="number">0X09</span>,<span class="number">0X05</span>,<span class="number">0X08</span>,<span class="number">0XC4</span>,<span class="number">0X5A</span>,<span class="number">0XEC</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDE</span>,<span class="number">0XFB</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,</span><br><span class="line"><span class="number">0X00</span>,<span class="number">0XC4</span>,<span class="number">0X41</span>,<span class="number">0XA7</span>,<span class="number">0XC0</span>,<span class="number">0XE6</span>,<span class="number">0XF8</span>,<span class="number">0X03</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0XA7</span>,<span class="number">0XF8</span>,<span class="number">0X87</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0XC7</span>,<span class="number">0XF9</span>,<span class="number">0X29</span>,<span class="number">0XF9</span>,<span class="number">0X8A</span>,<span class="number">0XF9</span>,<span class="number">0XAB</span>,<span class="number">0XF9</span>,<span class="number">0XAB</span>,<span class="number">0XF9</span>,<span class="number">0X8B</span>,<span class="number">0XF9</span>,<span class="number">0X6A</span>,<span class="number">0XF9</span>,<span class="number">0X29</span>,</span><br><span class="line"><span class="number">0XF9</span>,<span class="number">0X08</span>,<span class="number">0XF8</span>,<span class="number">0XC7</span>,<span class="number">0XF8</span>,<span class="number">0XA6</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF8</span>,<span class="number">0X64</span>,<span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XF0</span>,<span class="number">0X02</span>,</span><br><span class="line"><span class="number">0XB1</span>,<span class="number">0X06</span>,<span class="number">0X29</span>,<span class="number">0X25</span>,<span class="number">0X00</span>,<span class="number">0XE4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,<span class="number">0X9D</span>,<span class="number">0X14</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XAD</span>,<span class="number">0X96</span>,<span class="number">0X00</span>,<span class="number">0X62</span>,</span><br><span class="line"><span class="number">0X08</span>,<span class="number">0X82</span>,<span class="number">0X95</span>,<span class="number">0X35</span>,<span class="number">0XCE</span>,<span class="number">0XBA</span>,<span class="number">0XA2</span>,<span class="number">0X8B</span>,<span class="number">0XD0</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0X25</span>,<span class="number">0XF8</span>,<span class="number">0X87</span>,<span class="number">0XF8</span>,<span class="number">0XA7</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0XC7</span>,<span class="number">0XF8</span>,<span class="number">0XA7</span>,<span class="number">0XF8</span>,<span class="number">0X87</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X87</span>,<span class="number">0XF8</span>,<span class="number">0XA7</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0XA7</span>,<span class="number">0XF8</span>,<span class="number">0XA6</span>,<span class="number">0XF8</span>,<span class="number">0X85</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XF8</span>,<span class="number">0X64</span>,<span class="number">0XF0</span>,<span class="number">0X24</span>,<span class="number">0XB8</span>,<span class="number">0X64</span>,<span class="number">0X93</span>,<span class="number">0X0D</span>,</span><br><span class="line"><span class="number">0XB6</span>,<span class="number">0XBB</span>,<span class="number">0X63</span>,<span class="number">0XCF</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X21</span>,<span class="number">0X66</span>,<span class="number">0X3A</span>,<span class="number">0X49</span>,<span class="number">0XEF</span>,<span class="number">0X5D</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X94</span>,<span class="number">0XD3</span>,<span class="number">0X00</span>,<span class="number">0X42</span>,</span><br><span class="line"><span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0XCE</span>,<span class="number">0XBB</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XE7</span>,<span class="number">0XBE</span>,<span class="number">0XB5</span>,<span class="number">0X76</span>,<span class="number">0XAA</span>,<span class="number">0XCC</span>,<span class="number">0XC1</span>,<span class="number">0X07</span>,<span class="number">0XE0</span>,<span class="number">0X45</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X45</span>,<span class="number">0XF8</span>,<span class="number">0X46</span>,<span class="number">0XF8</span>,<span class="number">0X66</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X86</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,</span><br><span class="line"><span class="number">0XF8</span>,<span class="number">0X45</span>,<span class="number">0XF8</span>,<span class="number">0X65</span>,<span class="number">0XE8</span>,<span class="number">0X65</span>,<span class="number">0XD0</span>,<span class="number">0X44</span>,<span class="number">0XA8</span>,<span class="number">0X43</span>,<span class="number">0X88</span>,<span class="number">0X01</span>,<span class="number">0X90</span>,<span class="number">0X82</span>,<span class="number">0XD7</span>,<span class="number">0X3C</span>,</span><br><span class="line"><span class="number">0XEF</span>,<span class="number">0XFF</span>,<span class="number">0X95</span>,<span class="number">0X55</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,<span class="number">0X19</span>,<span class="number">0X46</span>,<span class="number">0X94</span>,<span class="number">0XB3</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X94</span>,<span class="number">0XB3</span>,<span class="number">0X00</span>,<span class="number">0X41</span>,</span><br><span class="line"><span class="number">0X21</span>,<span class="number">0X86</span>,<span class="number">0XDF</span>,<span class="number">0X5D</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XE7</span>,<span class="number">0XDF</span>,<span class="number">0XC6</span>,<span class="number">0X7A</span>,<span class="number">0XB4</span>,<span class="number">0XD3</span>,</span><br><span class="line"><span class="number">0XB3</span>,<span class="number">0X4E</span>,<span class="number">0XC2</span>,<span class="number">0X2A</span>,<span class="number">0XD1</span>,<span class="number">0X68</span>,<span class="number">0XE0</span>,<span class="number">0XE6</span>,<span class="number">0XE8</span>,<span class="number">0XA6</span>,<span class="number">0XE8</span>,<span class="number">0XA5</span>,<span class="number">0XE8</span>,<span class="number">0XA5</span>,<span class="number">0XD8</span>,<span class="number">0XE6</span>,</span><br><span class="line"><span class="number">0XC9</span>,<span class="number">0X88</span>,<span class="number">0XA9</span>,<span class="number">0X06</span>,<span class="number">0XA8</span>,<span class="number">0X22</span>,<span class="number">0XA8</span>,<span class="number">0X02</span>,<span class="number">0XA0</span>,<span class="number">0X00</span>,<span class="number">0XC8</span>,<span class="number">0X00</span>,<span class="number">0XD8</span>,<span class="number">0X00</span>,<span class="number">0XE5</span>,<span class="number">0XF7</span>,</span><br><span class="line"><span class="number">0XE7</span>,<span class="number">0XFF</span>,<span class="number">0XAD</span>,<span class="number">0XF8</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X4A</span>,<span class="number">0X8B</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XA5</span>,<span class="number">0X55</span>,<span class="number">0X00</span>,<span class="number">0X41</span>,</span><br><span class="line"><span class="number">0X29</span>,<span class="number">0XA7</span>,<span class="number">0XDF</span>,<span class="number">0X5D</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XEF</span>,<span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0X7D</span>,<span class="number">0XCE</span>,<span class="number">0XDB</span>,<span class="number">0XCE</span>,<span class="number">0X59</span>,<span class="number">0XCD</span>,<span class="number">0XF8</span>,<span class="number">0XCD</span>,<span class="number">0XD7</span>,<span class="number">0XC5</span>,<span class="number">0XF7</span>,<span class="number">0XCE</span>,<span class="number">0X79</span>,</span><br><span class="line"><span class="number">0XBE</span>,<span class="number">0XFB</span>,<span class="number">0XA2</span>,<span class="number">0XAB</span>,<span class="number">0XF0</span>,<span class="number">0X03</span>,<span class="number">0XF8</span>,<span class="number">0X45</span>,<span class="number">0XD0</span>,<span class="number">0X42</span>,<span class="number">0XE8</span>,<span class="number">0X43</span>,<span class="number">0XF0</span>,<span class="number">0X00</span>,<span class="number">0XD4</span>,<span class="number">0X72</span>,</span><br><span class="line"><span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XAE</span>,<span class="number">0X39</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X05</span>,<span class="number">0X29</span>,<span class="number">0X87</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XCE</span>,<span class="number">0X59</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,</span><br><span class="line"><span class="number">0X21</span>,<span class="number">0X46</span>,<span class="number">0XD7</span>,<span class="number">0X1C</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XEF</span>,<span class="number">0XFF</span>,<span class="number">0XBA</span>,<span class="number">0X8B</span>,<span class="number">0XF8</span>,<span class="number">0X04</span>,<span class="number">0XF8</span>,<span class="number">0X45</span>,<span class="number">0XE0</span>,<span class="number">0X62</span>,<span class="number">0XF0</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0X00</span>,<span class="number">0XDB</span>,<span class="number">0X8E</span>,</span><br><span class="line"><span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XA5</span>,<span class="number">0XF8</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0XBE</span>,<span class="number">0X29</span>,<span class="number">0X87</span>,</span><br><span class="line"><span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0XB6</span>,<span class="number">0X39</span>,<span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XE7</span>,<span class="number">0XBE</span>,<span class="number">0XBA</span>,<span class="number">0X4A</span>,<span class="number">0XF8</span>,<span class="number">0X03</span>,<span class="number">0XF8</span>,<span class="number">0X45</span>,<span class="number">0XF8</span>,<span class="number">0X64</span>,<span class="number">0XF8</span>,<span class="number">0X44</span>,<span class="number">0XF8</span>,<span class="number">0X00</span>,<span class="number">0XE3</span>,<span class="number">0X6E</span>,</span><br><span class="line"><span class="number">0XD7</span>,<span class="number">0XFF</span>,<span class="number">0X8C</span>,<span class="number">0XF4</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X04</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X10</span>,<span class="number">0XE4</span>,<span class="number">0X19</span>,<span class="number">0X05</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X73</span>,<span class="number">0XEF</span>,</span><br><span class="line"><span class="number">0X00</span>,<span class="number">0X00</span>,<span class="number">0X84</span>,<span class="number">0X72</span>,<span class="number">0XEF</span>,<span class="number">0XFF</span>,<span class="number">0XEF</span>,<span class="number">0XBE</span>,<span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XE7</span>,<span class="number">0XDF</span>,<span class="number">0XBA</span>,<span class="number">0X8B</span>,<span class="number">0XF8</span>,<span class="number">0X03</span>,<span class="number">0XF8</span>,<span class="number">0X45</span>,<span class="number">0XF8</span>,<span class="number">0X45</span>,<span class="number">0XF8</span>,<span class="number">0X23</span>,<span class="number">0XF8</span>,<span class="number">0X00</span>,<span class="number">0XD4</span>,<span class="number">0XD3</span>,</span><br><span class="line"><span class="number">0XD7</span>,<span class="number">0XFF</span>,<span class="number">0X5B</span>,<span class="number">0X4E</span>,<span class="number">0X00</span>,<span class="number">0X21</span>,<span class="number">0X3A</span>,<span class="number">0X29</span>,<span class="number">0XA5</span>,<span class="number">0X55</span>,<span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X10</span>,<span class="number">0XC4</span>,<span class="number">0X19</span>,<span class="number">0X25</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDE</span>,<span class="number">0XFB</span>,</span><br><span class="line"><span class="number">0X08</span>,<span class="number">0XA3</span>,<span class="number">0X31</span>,<span class="number">0XE8</span>,<span class="number">0XDF</span>,<span class="number">0X9E</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XEF</span>,<span class="number">0XBF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XF7</span>,<span class="number">0XFF</span>,<span class="number">0XBC</span>,<span class="number">0X51</span>,<span class="number">0XE0</span>,<span class="number">0X02</span>,<span class="number">0XF8</span>,<span class="number">0X03</span>,<span class="number">0XF0</span>,<span class="number">0X03</span>,<span class="number">0XE0</span>,<span class="number">0X43</span>,<span class="number">0XC2</span>,<span class="number">0XEC</span>,<span class="number">0XCF</span>,<span class="number">0X7E</span>,</span><br><span class="line"><span class="number">0XBE</span>,<span class="number">0XFC</span>,<span class="number">0X21</span>,<span class="number">0X46</span>,<span class="number">0X00</span>,<span class="number">0X21</span>,<span class="number">0X94</span>,<span class="number">0XD3</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X84</span>,<span class="number">0X51</span>,<span class="number">0X00</span>,<span class="number">0X00</span>,<span class="number">0X29</span>,<span class="number">0X87</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0X84</span>,<span class="number">0X51</span>,<span class="number">0X00</span>,<span class="number">0X00</span>,<span class="number">0X8C</span>,<span class="number">0XF4</span>,<span class="number">0XEF</span>,<span class="number">0XFF</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XEF</span>,<span class="number">0XBF</span>,<span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0X3D</span>,<span class="number">0XBD</span>,<span class="number">0X55</span>,<span class="number">0XBC</span>,<span class="number">0X52</span>,<span class="number">0XBC</span>,<span class="number">0X72</span>,<span class="number">0XB5</span>,<span class="number">0XB7</span>,<span class="number">0XC7</span>,<span class="number">0X5D</span>,<span class="number">0XDF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0X6B</span>,<span class="number">0XF0</span>,<span class="number">0X00</span>,<span class="number">0X00</span>,<span class="number">0X3A</span>,<span class="number">0X09</span>,<span class="number">0XF7</span>,<span class="number">0XBF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X9D</span>,<span class="number">0X14</span>,<span class="number">0XA5</span>,<span class="number">0X55</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0X4A</span>,<span class="number">0XAC</span>,<span class="number">0X08</span>,<span class="number">0XA4</span>,<span class="number">0XBE</span>,<span class="number">0XBB</span>,<span class="number">0XE7</span>,<span class="number">0XDF</span>,<span class="number">0XE7</span>,<span class="number">0X7E</span>,<span class="number">0XEF</span>,<span class="number">0XBE</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,<span class="number">0XEF</span>,<span class="number">0XFF</span>,<span class="number">0XDF</span>,<span class="number">0XDF</span>,<span class="number">0XD7</span>,<span class="number">0XBF</span>,<span class="number">0XD7</span>,<span class="number">0X9E</span>,<span class="number">0XDF</span>,<span class="number">0XDF</span>,<span class="number">0XA5</span>,<span class="number">0XD8</span>,</span><br><span class="line"><span class="number">0X08</span>,<span class="number">0X83</span>,<span class="number">0X11</span>,<span class="number">0X26</span>,<span class="number">0XD6</span>,<span class="number">0XDB</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XEE</span>,<span class="number">0X79</span>,<span class="number">0XDC</span>,<span class="number">0X8B</span>,<span class="number">0X31</span>,<span class="number">0X21</span>,<span class="number">0X21</span>,<span class="number">0XA9</span>,<span class="number">0XCF</span>,<span class="number">0X3D</span>,<span class="number">0XDF</span>,<span class="number">0XBF</span>,<span class="number">0XDF</span>,<span class="number">0X7E</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,</span><br><span class="line"><span class="number">0XEF</span>,<span class="number">0XBE</span>,<span class="number">0XEF</span>,<span class="number">0XBF</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,<span class="number">0XF7</span>,<span class="number">0XDF</span>,<span class="number">0XEF</span>,<span class="number">0XBF</span>,</span><br><span class="line"><span class="number">0XEF</span>,<span class="number">0XBE</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XDF</span>,<span class="number">0X7E</span>,<span class="number">0XD7</span>,<span class="number">0X5E</span>,<span class="number">0XD7</span>,<span class="number">0X5E</span>,<span class="number">0XDF</span>,<span class="number">0XDF</span>,<span class="number">0XB6</span>,<span class="number">0X9A</span>,<span class="number">0X19</span>,<span class="number">0X26</span>,</span><br><span class="line"><span class="number">0X08</span>,<span class="number">0X42</span>,<span class="number">0XA3</span>,<span class="number">0XED</span>,<span class="number">0XFF</span>,<span class="number">0XBF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDD</span>,<span class="number">0X74</span>,</span><br><span class="line"><span class="number">0XDB</span>,<span class="number">0XC0</span>,<span class="number">0XFE</span>,<span class="number">0X00</span>,<span class="number">0XEE</span>,<span class="number">0X42</span>,<span class="number">0X42</span>,<span class="number">0X02</span>,<span class="number">0X21</span>,<span class="number">0X89</span>,<span class="number">0XB6</span>,<span class="number">0X7B</span>,<span class="number">0XDF</span>,<span class="number">0XDF</span>,<span class="number">0XD7</span>,<span class="number">0X7E</span>,</span><br><span class="line"><span class="number">0XDF</span>,<span class="number">0X7E</span>,<span class="number">0XDF</span>,<span class="number">0X7E</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XE7</span>,<span class="number">0X9E</span>,<span class="number">0XDF</span>,<span class="number">0X7E</span>,</span><br><span class="line"><span class="number">0XDF</span>,<span class="number">0X7E</span>,<span class="number">0XD7</span>,<span class="number">0X5D</span>,<span class="number">0XD7</span>,<span class="number">0X5D</span>,<span class="number">0XDF</span>,<span class="number">0X9E</span>,<span class="number">0XE7</span>,<span class="number">0XFF</span>,<span class="number">0XA5</span>,<span class="number">0XF8</span>,<span class="number">0X11</span>,<span class="number">0X07</span>,<span class="number">0X18</span>,<span class="number">0XE3</span>,</span><br><span class="line"><span class="number">0XC5</span>,<span class="number">0X02</span>,<span class="number">0XFD</span>,<span class="number">0X60</span>,<span class="number">0XD3</span>,<span class="number">0XE6</span>,<span class="number">0XEE</span>,<span class="number">0XDB</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XF7</span>,<span class="number">0X9E</span>,<span class="number">0XBA</span>,<span class="number">0X84</span>,</span><br><span class="line"><span class="number">0XFC</span>,<span class="number">0XC1</span>,<span class="number">0XFE</span>,<span class="number">0X42</span>,<span class="number">0XFE</span>,<span class="number">0X82</span>,<span class="number">0XFE</span>,<span class="number">0XA2</span>,<span class="number">0X83</span>,<span class="number">0X81</span>,<span class="number">0X21</span>,<span class="number">0X45</span>,<span class="number">0X74</span>,<span class="number">0X74</span>,<span class="number">0XC7</span>,<span class="number">0X5E</span>,</span><br><span class="line"><span class="number">0XDF</span>,<span class="number">0XDF</span>,<span class="number">0XD7</span>,<span class="number">0X7E</span>,<span class="number">0XD7</span>,<span class="number">0X5E</span>,<span class="number">0XD7</span>,<span class="number">0X5D</span>,<span class="number">0XD7</span>,<span class="number">0X5E</span>,<span class="number">0XD7</span>,<span class="number">0X5E</span>,<span class="number">0XD7</span>,<span class="number">0X5D</span>,<span class="number">0XD7</span>,<span class="number">0X5D</span>,</span><br><span class="line"><span class="number">0XD7</span>,<span class="number">0X5E</span>,<span class="number">0XDF</span>,<span class="number">0X9E</span>,<span class="number">0XE7</span>,<span class="number">0XFF</span>,<span class="number">0XC7</span>,<span class="number">0X3D</span>,<span class="number">0X63</span>,<span class="number">0XF1</span>,<span class="number">0X08</span>,<span class="number">0X84</span>,<span class="number">0X52</span>,<span class="number">0X42</span>,<span class="number">0XE6</span>,<span class="number">0X26</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0X29</span>,<span class="number">0XFE</span>,<span class="number">0X86</span>,<span class="number">0XF3</span>,<span class="number">0XE0</span>,<span class="number">0XC3</span>,<span class="number">0X6A</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XDE</span>,<span class="number">0X18</span>,<span class="number">0XD2</span>,<span class="number">0XC1</span>,</span><br><span class="line"><span class="number">0XFD</span>,<span class="number">0XA2</span>,<span class="number">0XFE</span>,<span class="number">0X22</span>,<span class="number">0XFE</span>,<span class="number">0X42</span>,<span class="number">0XFE</span>,<span class="number">0X42</span>,<span class="number">0XFE</span>,<span class="number">0X62</span>,<span class="number">0XD4</span>,<span class="number">0XE2</span>,<span class="number">0X6A</span>,<span class="number">0X41</span>,<span class="number">0X42</span>,<span class="number">0X49</span>,</span><br><span class="line"><span class="number">0X74</span>,<span class="number">0X53</span>,<span class="number">0XA6</span>,<span class="number">0X3B</span>,<span class="number">0XC7</span>,<span class="number">0X3E</span>,<span class="number">0XD7</span>,<span class="number">0XBF</span>,<span class="number">0XD7</span>,<span class="number">0XBF</span>,<span class="number">0XD7</span>,<span class="number">0XBF</span>,<span class="number">0XDF</span>,<span class="number">0XBF</span>,<span class="number">0XD7</span>,<span class="number">0XBF</span>,</span><br><span class="line"><span class="number">0XC7</span>,<span class="number">0X3E</span>,<span class="number">0XA6</span>,<span class="number">0X1A</span>,<span class="number">0X63</span>,<span class="number">0XF2</span>,<span class="number">0X29</span>,<span class="number">0XA7</span>,<span class="number">0X41</span>,<span class="number">0X82</span>,<span class="number">0XB4</span>,<span class="number">0X22</span>,<span class="number">0XFE</span>,<span class="number">0X62</span>,<span class="number">0XFE</span>,<span class="number">0X83</span>,</span><br><span class="line"><span class="number">0XFE</span>,<span class="number">0XAA</span>,<span class="number">0XFF</span>,<span class="number">0X0F</span>,<span class="number">0XFD</span>,<span class="number">0X67</span>,<span class="number">0XBA</span>,<span class="number">0X63</span>,<span class="number">0XEF</span>,<span class="number">0X3C</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XE6</span>,<span class="number">0X9A</span>,<span class="number">0XD2</span>,<span class="number">0X80</span>,</span><br><span class="line"><span class="number">0XFD</span>,<span class="number">0X21</span>,<span class="number">0XFD</span>,<span class="number">0XC2</span>,<span class="number">0XF5</span>,<span class="number">0XE2</span>,<span class="number">0XF5</span>,<span class="number">0XC2</span>,<span class="number">0XF5</span>,<span class="number">0X82</span>,<span class="number">0XFD</span>,<span class="number">0X82</span>,<span class="number">0XFD</span>,<span class="number">0X62</span>,<span class="number">0XDC</span>,<span class="number">0X61</span>,</span><br><span class="line"><span class="number">0X9B</span>,<span class="number">0X21</span>,<span class="number">0X6A</span>,<span class="number">0X84</span>,<span class="number">0X6A</span>,<span class="number">0XE9</span>,<span class="number">0X63</span>,<span class="number">0X2C</span>,<span class="number">0X63</span>,<span class="number">0XAF</span>,<span class="number">0X74</span>,<span class="number">0X11</span>,<span class="number">0X63</span>,<span class="number">0X6E</span>,<span class="number">0X63</span>,<span class="number">0X2C</span>,</span><br><span class="line"><span class="number">0X5A</span>,<span class="number">0X89</span>,<span class="number">0X52</span>,<span class="number">0X04</span>,<span class="number">0X7A</span>,<span class="number">0X81</span>,<span class="number">0XCB</span>,<span class="number">0XC2</span>,<span class="number">0XFC</span>,<span class="number">0XE2</span>,<span class="number">0XFD</span>,<span class="number">0X62</span>,<span class="number">0XFD</span>,<span class="number">0X82</span>,<span class="number">0XFD</span>,<span class="number">0XC2</span>,</span><br><span class="line"><span class="number">0XFD</span>,<span class="number">0XC2</span>,<span class="number">0XFD</span>,<span class="number">0XE4</span>,<span class="number">0XFD</span>,<span class="number">0X24</span>,<span class="number">0XCA</span>,<span class="number">0X62</span>,<span class="number">0XE7</span>,<span class="number">0X1C</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XCC</span>,<span class="number">0XB1</span>,</span><br><span class="line"><span class="number">0XD2</span>,<span class="number">0X81</span>,<span class="number">0XF3</span>,<span class="number">0XC0</span>,<span class="number">0XFC</span>,<span class="number">0XC1</span>,<span class="number">0XFD</span>,<span class="number">0X02</span>,<span class="number">0XFD</span>,<span class="number">0X02</span>,<span class="number">0XFC</span>,<span class="number">0XE2</span>,<span class="number">0XFC</span>,<span class="number">0XC2</span>,<span class="number">0XFC</span>,<span class="number">0XC2</span>,</span><br><span class="line"><span class="number">0XFC</span>,<span class="number">0X81</span>,<span class="number">0XFB</span>,<span class="number">0X80</span>,<span class="number">0XC9</span>,<span class="number">0XC0</span>,<span class="number">0X81</span>,<span class="number">0XA4</span>,<span class="number">0XAD</span>,<span class="number">0X35</span>,<span class="number">0XCE</span>,<span class="number">0X59</span>,<span class="number">0X9C</span>,<span class="number">0X71</span>,<span class="number">0X81</span>,<span class="number">0X21</span>,</span><br><span class="line"><span class="number">0XDA</span>,<span class="number">0X00</span>,<span class="number">0XFB</span>,<span class="number">0XA1</span>,<span class="number">0XFC</span>,<span class="number">0X82</span>,<span class="number">0XFC</span>,<span class="number">0XA2</span>,<span class="number">0XFC</span>,<span class="number">0X82</span>,<span class="number">0XFC</span>,<span class="number">0XA2</span>,<span class="number">0XFD</span>,<span class="number">0X02</span>,<span class="number">0XFD</span>,<span class="number">0X22</span>,</span><br><span class="line"><span class="number">0XFC</span>,<span class="number">0XE2</span>,<span class="number">0XFC</span>,<span class="number">0X00</span>,<span class="number">0XDA</span>,<span class="number">0X60</span>,<span class="number">0XCC</span>,<span class="number">0X90</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line"><span class="number">0XDE</span>,<span class="number">0X59</span>,<span class="number">0XC4</span>,<span class="number">0X0D</span>,<span class="number">0XCB</span>,<span class="number">0X06</span>,<span class="number">0XD2</span>,<span class="number">0XE4</span>,<span class="number">0XDB</span>,<span class="number">0X03</span>,<span class="number">0XDB</span>,<span class="number">0X03</span>,<span class="number">0XDA</span>,<span class="number">0XE3</span>,<span class="number">0XD2</span>,<span class="number">0XC3</span>,</span><br><span class="line"><span class="number">0XC2</span>,<span class="number">0XA4</span>,<span class="number">0XB3</span>,<span class="number">0X09</span>,<span class="number">0XBC</span>,<span class="number">0XD2</span>,<span class="number">0XF7</span>,<span class="number">0X9E</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XE6</span>,<span class="number">0XFB</span>,</span><br><span class="line"><span class="number">0XB4</span>,<span class="number">0X0E</span>,<span class="number">0XBA</span>,<span class="number">0XA6</span>,<span class="number">0XD2</span>,<span class="number">0X83</span>,<span class="number">0XE2</span>,<span class="number">0XE3</span>,<span class="number">0XEB</span>,<span class="number">0X02</span>,<span class="number">0XEB</span>,<span class="number">0X22</span>,<span class="number">0XE3</span>,<span class="number">0X22</span>,<span class="number">0XDB</span>,<span class="number">0X03</span>,</span><br><span class="line"><span class="number">0XD2</span>,<span class="number">0XE4</span>,<span class="number">0XC3</span>,<span class="number">0X6A</span>,<span class="number">0XD5</span>,<span class="number">0XB6</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,<span class="number">0XFF</span>,</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure><h2 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h2><h3 id="显示字符串"><a href="#显示字符串" class="headerlink" title="显示字符串"></a>显示字符串</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LCD_ShowString(<span class="number">20</span>, <span class="number">100</span>, <span class="string">&quot;Hello World!&quot;</span>, ST7789_BLACK,ST7789_WHITE,<span class="number">16</span>,<span class="number">0</span>); <span class="comment">//字符串</span></span><br></pre></td></tr></table></figure><h3 id="显示整型"><a href="#显示整型" class="headerlink" title="显示整型"></a>显示整型</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LCD_ShowIntNum(<span class="number">20</span>,<span class="number">80</span>,<span class="number">666666</span>,<span class="number">4</span>,ST7789_RED,ST7789_WHITE,<span class="number">16</span>); <span class="comment">//整数</span></span><br></pre></td></tr></table></figure><h3 id="显示浮点"><a href="#显示浮点" class="headerlink" title="显示浮点"></a>显示浮点</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LCD_ShowFloatNum1(<span class="number">20</span>, <span class="number">80</span>, <span class="number">1314.520</span>, <span class="number">4</span>, ST7789_RED, ST7789_WHITE, <span class="number">16</span>); <span class="comment">//浮点</span></span><br></pre></td></tr></table></figure><h3 id="显示中文"><a href="#显示中文" class="headerlink" title="显示中文"></a>显示中文</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LCD_ShowChinese(<span class="number">8</span>,<span class="number">60</span>,<span class="string">&quot;电子&quot;</span>,ST7789_RED,ST7789_WHITE,<span class="number">16</span>,<span class="number">0</span>); <span class="comment">//汉字</span></span><br></pre></td></tr></table></figure><h3 id="显示整图片"><a href="#显示整图片" class="headerlink" title="显示整图片"></a>显示整图片</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LCD_ShowPicture(<span class="number">65</span>,<span class="number">80</span>,<span class="number">40</span>,<span class="number">40</span>,gImage_1); <span class="comment">//图片</span></span><br></pre></td></tr></table></figure><h3 id="显示圆"><a href="#显示圆" class="headerlink" title="显示圆"></a>显示圆</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LCD_Draw_Circle(<span class="number">45</span>, <span class="number">175</span>, <span class="number">35</span>, ST7789_GREEN); <span class="comment">//圆</span></span><br></pre></td></tr></table></figure><h3 id="显示线"><a href="#显示线" class="headerlink" title="显示线"></a>显示线</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LCD_DrawLine(<span class="number">0</span>, <span class="number">125</span>,<span class="number">240</span>, <span class="number">125</span>, ST7789_BLACK); <span class="comment">//线</span></span><br></pre></td></tr></table></figure><h3 id="完整实例"><a href="#完整实例" class="headerlink" title="完整实例"></a>完整实例</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;delay.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;sys.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;lcd_init.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;lcd.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;pic.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">float</span> t=<span class="number">0</span>;</span><br><span class="line">delay_init();</span><br><span class="line">LCD_Init();<span class="comment">//LCD初始化</span></span><br><span class="line">LCD_Fill(<span class="number">0</span>,<span class="number">0</span>,LCD_W,LCD_H,ST7789_WHITE); <span class="comment">//整屏清除</span></span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">LCD_ShowChinese(<span class="number">8</span>,<span class="number">60</span>,<span class="string">&quot;科技&quot;</span>,ST7789_RED,ST7789_WHITE,<span class="number">16</span>,<span class="number">0</span>);<span class="comment">//汉字</span></span><br><span class="line">LCD_ShowFloatNum1(<span class="number">20</span>,<span class="number">80</span>,t,<span class="number">4</span>,ST7789_RED,ST7789_WHITE,<span class="number">16</span>);<span class="comment">//浮点数字</span></span><br><span class="line">LCD_ShowIntNum(<span class="number">20</span>,<span class="number">80</span>,t,<span class="number">4</span>,ST7789_RED,ST7789_WHITE,<span class="number">16</span>);<span class="comment">//浮点数字</span></span><br><span class="line">LCD_ShowString(<span class="number">20</span>, <span class="number">100</span>, <span class="string">&quot;Hello&quot;</span>, ST7789_GRAY,ST7789_WHITE,<span class="number">16</span>,<span class="number">0</span>);</span><br><span class="line">t+=<span class="number">0.11</span>;  <span class="comment">//数值改变 循环</span></span><br><span class="line">LCD_ShowPicture(<span class="number">65</span>,<span class="number">80</span>,<span class="number">40</span>,<span class="number">40</span>,gImage_1); <span class="comment">//图片</span></span><br><span class="line">LCD_DrawLine(<span class="number">0</span>, <span class="number">125</span>,<span class="number">240</span>, <span class="number">125</span>, ST7789_BLACK);<span class="comment">//线</span></span><br><span class="line">LCD_Draw_Circle(<span class="number">45</span>, <span class="number">175</span>, <span class="number">35</span>, ST7789_GREEN);<span class="comment">//圆</span></span><br><span class="line">delay_ms(<span class="number">200</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="展示"><a href="#展示" class="headerlink" title="展示"></a>展示</h2><p><img src="/img/post/st7789.jpg" alt="实例展示"></p><h2 id="声明"><a href="#声明" class="headerlink" title="声明"></a>声明</h2><p>本文章移植的是ST7735S模块和STM32F103C8T6的ST7789的移植。</p>]]></content>
    
    
    <summary type="html">在嵌入式系统开发中，显示屏幕是与用户交互的重要组成部分。ST7789是一款常用的TFT LCD驱动IC，广泛应用于各种小型显示屏幕中。本文将介绍如何为STM32F103RCT6微控制器编写ST7789 1.3寸屏幕驱动程序，并提供基本的初始化和显示功能。</summary>
    
    
    
    <category term="STM32" scheme="https://blog.natuie.net/categories/STM32/"/>
    
    
    <category term="驱动" scheme="https://blog.natuie.net/tags/%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>Idea调试跳过源代码</title>
    <link href="https://blog.natuie.net/posts/2024/08/11/002618/"/>
    <id>https://blog.natuie.net/posts/2024/08/11/002618/</id>
    <published>2024-08-10T16:26:18.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<h2 id="常用调试方法"><a href="#常用调试方法" class="headerlink" title="常用调试方法"></a>常用调试方法</h2><ol><li><strong>Step Over (F8)</strong>: **步过(单步走过-路过方法而不入)**，一行一行地往下走，如果这一行上有方法不会进入方法。</li><li><strong>Step Into (F7)</strong>: **步入(即单步执行,路过方法进去瞅一瞅)**。如果当前行有方法，可以进入方法内部，<code>一般用于进入自定义方法内</code>，不会进入官方类库的方法。</li><li><strong>Step Out (Shift + F8)</strong>: <strong>步出，从步入的方法内退出到方法调用处</strong>，此时方法已执行完毕，只是还没有完成赋值。</li><li><strong>Drop Frame (Alt + Shift + F8)</strong>: 这个操作允许你回到调用栈中的上一个方法，重新执行当前方法。这在你想要重新执行当前方法而不影响其他方法的执行时非常有用。</li><li><strong>Force Step Over (Alt + Shift + F9)</strong>: 这个操作类似于Step Over，但它会强制执行当前行的代码，即使它是一个方法调用。这在你想要跳过某些特定方法的调试时非常有用。</li></ol><h2 id="调试不进入源代码"><a href="#调试不进入源代码" class="headerlink" title="调试不进入源代码"></a>调试不进入源代码</h2><p>在使用IntelliJ IDEA进行调试时，如果你希望跳过某些源代码的调试，可以使用“Step Over”功能来实现。这个功能允许你在当前方法的执行过程中跳过对其他方法的单步调试。以下是详细步骤：</p><p>进入 Settings -&gt; Build, Execution, Deployment -&gt; Debugger -&gt; Stepping 设置界面，将 Do not step into the classes 勾选，然后将下面列表按需求勾选，然后添加一些不需要进入源代码的包名：</p><ul><li><code>org.springframework.*</code></li><li><code>org.hibernate.*</code></li><li><code>org.apache.*</code></li><li><code>jakarta.*</code></li><li><code>org.slf4j.*</code></li><li><code>lombok.*</code></li><li><code>org.junit.*</code></li><li><code>com.google.*</code></li><li>可以选择性勾选，也可以全选，这里只列举了一部分，按需自己找包名复制进去</li></ul><p><img src="/img/post/image-20240811164646329.png" alt="IDEA配置页面"></p>]]></content>
    
    
    <summary type="html">在使用IntelliJ IDEA进行调试时，如果你希望跳过某些源代码的调试，可以使用“Step Over”功能来实现。这个功能允许你在当前方法的执行过程中跳过对其他方法的单步调试</summary>
    
    
    
    <category term="Idea" scheme="https://blog.natuie.net/categories/Idea/"/>
    
    
    <category term="调试" scheme="https://blog.natuie.net/tags/%E8%B0%83%E8%AF%95/"/>
    
  </entry>
  
  <entry>
    <title>SpringBoot3 整合 Security6.3-JWT-JPA-Redis 实现注册登陆</title>
    <link href="https://blog.natuie.net/posts/2024/08/10/225307/"/>
    <id>https://blog.natuie.net/posts/2024/08/10/225307/</id>
    <published>2024-08-10T14:53:07.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1、概述"><a href="#1、概述" class="headerlink" title="1、概述"></a>1、概述</h2><p>在现代Web应用开发中，安全是一个至关重要的方面。本文将介绍如何将Spring Boot 3、PostgreSQL数据库、JPA、Spring Security 6.3、Redis和JWT整合在一起，实现一个安全的用户认证和授权系统。</p><h2 id="2、项目主要环境"><a href="#2、项目主要环境" class="headerlink" title="2、项目主要环境"></a>2、项目主要环境</h2><ul><li><strong>Spring Boot</strong>: 3.3.1</li><li><strong>PostgreSQL</strong>: 16.1</li><li><strong>Spring Security</strong>: 6.3</li><li><strong>Redis</strong>: 5.0.14.1</li><li><strong>JWT</strong>: 0.12.3</li></ul><h2 id="3、Spring-Security-6与JWT的介绍"><a href="#3、Spring-Security-6与JWT的介绍" class="headerlink" title="3、Spring Security 6与JWT的介绍"></a>3、Spring Security 6与JWT的介绍</h2><p>Spring Security 6是Spring框架中用于安全性的核心库，它提供了全面的安全服务，包括认证、授权、防止常见攻击等。JWT（JSON Web Tokens）是一种开放标准（RFC 7519），用于在网络应用环境间安全地传输声明（claims）。</p><h3 id="Spring-Security-6"><a href="#Spring-Security-6" class="headerlink" title="Spring Security 6"></a>Spring Security 6</h3><p>Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它主要专注于为Java应用程序提供身份验证和授权。Spring Security 6是该框架的最新版本，它提供了许多改进和新特性，比如对现代安全威胁的增强防护、更灵活的配置选项、更好的性能等。</p><p>Spring Security 6的核心概念包括：</p><ul><li><strong>认证（Authentication）</strong>：验证用户身份的过程。这是确定用户是否是他们所声称的那个人的过程。</li><li><strong>授权（Authorization）</strong>：在用户被认证之后，授权过程决定用户是否有权限执行特定的操作。</li><li><strong>保护（Protection）</strong>：保护应用免受攻击，例如CSRF（跨站请求伪造）、XSS（跨站脚本攻击）等。</li></ul><h3 id="JWT"><a href="#JWT" class="headerlink" title="JWT"></a>JWT</h3><p>JWT是一种紧凑的、自包含的方式，用于在各方之间以JSON对象的形式安全传输信息。JWT可以使用HMAC算法或使用RSA的公钥&#x2F;私钥对进行签名。</p><p>JWT通常用于身份验证和信息交换，特别是在Web应用中，作为客户端和服务器之间传递安全信息的手段。一个JWT实际上是一个被编码的字符串，包含三个部分：</p><ul><li><strong>Header（头部）</strong>：通常由两部分组成：令牌的类型（即JWT）和所使用的签名算法，例如HMAC SHA256或RSA。</li><li><strong>Payload（有效载荷）</strong>：包含所要传递的数据，这些数据是关于实体（通常是用户）的声明（claims）。声明可以是注册的（registered）声明，也可以是公开的（public）声明，或者是私有的（private）声明。</li><li><strong>Signature（签名）</strong>：为了创建签名部分，你必须有编码后的header、编码后的payload、一个密钥、header中指定的算法进行签名。签名用于验证消息在此过程中未被篡改。</li></ul><h3 id="Spring-Security-6与JWT整合"><a href="#Spring-Security-6与JWT整合" class="headerlink" title="Spring Security 6与JWT整合"></a>Spring Security 6与JWT整合</h3><p>在Spring Security 6中整合JWT，通常涉及以下步骤：</p><ol><li><p><strong>配置Spring Security</strong>：设置安全规则，允许对登录端点的匿名访问，而其他所有请求都需要认证。</p></li><li><p><strong>用户详情服务</strong>：实现<code>UserDetailsService</code>接口，用于从数据库加载用户信息，并提供密码的加密和解密。</p></li><li><p><strong>JWT工具类</strong>：创建一个工具类来生成和验证JWT。这个类将包含生成JWT的逻辑，以及一个方法来从JWT中提取用户名。</p></li><li><p><strong>登录控制器</strong>：创建一个控制器来处理用户的登录请求。登录控制器将验证用户凭证，然后生成JWT作为响应。</p></li><li><p><strong>认证拦截器</strong>：创建一个拦截器，拦截进入的请求，并检查JWT的有效性。</p></li></ol><p>整合JWT和Spring Security 6可以提供一个安全、高效且易于扩展的身份验证机制。通过这种方式，你可以保护你的Web应用，确保只有经过授权的用户才能访问敏感资源。</p><h2 id="4、认证过程"><a href="#4、认证过程" class="headerlink" title="4、认证过程"></a>4、认证过程</h2><p>在Web应用中，认证过程是验证用户身份并授权用户访问受保护资源的关键步骤。以下是使用Spring Security和JWT进行认证的一般步骤：</p><h3 id="1-用户提交认证信息"><a href="#1-用户提交认证信息" class="headerlink" title="1. 用户提交认证信息"></a>1. 用户提交认证信息</h3><p>用户通过登录表单或API端点提交他们的认证信息，通常包括用户名和密码。</p><h3 id="2-认证请求到达过滤器"><a href="#2-认证请求到达过滤器" class="headerlink" title="2. 认证请求到达过滤器"></a>2. 认证请求到达过滤器</h3><p>在Spring Security中，所有的HTTP请求都会被过滤器链拦截。对于登录请求，通常会有一个专门的过滤器（例如<code>UsernamePasswordAuthenticationFilter</code>）来处理用户名和密码。</p><h3 id="3-过滤器验证凭证"><a href="#3-过滤器验证凭证" class="headerlink" title="3. 过滤器验证凭证"></a>3. 过滤器验证凭证</h3><p>过滤器会调用<code>AuthenticationManager</code>来验证用户提交的凭证。<code>AuthenticationManager</code>是一个接口，它定义了一个方法<code>authenticate</code>，用于执行实际的认证逻辑。</p><h3 id="4-用户详情服务检索用户信息"><a href="#4-用户详情服务检索用户信息" class="headerlink" title="4. 用户详情服务检索用户信息"></a>4. 用户详情服务检索用户信息</h3><p><code>AuthenticationManager</code>通常会委托给一个<code>AuthenticationProvider</code>，后者会调用<code>UserDetailsService</code>来根据用户名检索用户信息。<code>UserDetailsService</code>会返回一个<code>UserDetails</code>对象，其中包含了用户信息和权限。</p><h3 id="5-凭证验证"><a href="#5-凭证验证" class="headerlink" title="5. 凭证验证"></a>5. 凭证验证</h3><p><code>AuthenticationProvider</code>会比较从数据库中检索到的用户密码（通常需要解密或验证）和用户提交的密码。如果密码匹配，<code>AuthenticationProvider</code>会创建一个<code>Authentication</code>对象，该对象包含了用户认证成功后的详细信息，如用户的角色和权限。</p><h3 id="6-生成JWT"><a href="#6-生成JWT" class="headerlink" title="6. 生成JWT"></a>6. 生成JWT</h3><p>一旦用户通过认证，系统会生成一个JWT。这个JWT通常包含用户的身份信息（如用户ID）和一些元数据（如过期时间）。然后，使用一个密钥对JWT进行签名，以确保其完整性和真实性。</p><h3 id="7-返回JWT给客户端"><a href="#7-返回JWT给客户端" class="headerlink" title="7. 返回JWT给客户端"></a>7. 返回JWT给客户端</h3><p>认证成功后，服务器会将生成的JWT作为响应的一部分返回给客户端。客户端（如浏览器或移动应用）需要将这个JWT存储起来，通常是在HTTP请求的<code>Authorization</code>头部中以<code>Bearer</code>模式发送。</p><h3 id="8-客户端发送JWT进行后续请求"><a href="#8-客户端发送JWT进行后续请求" class="headerlink" title="8. 客户端发送JWT进行后续请求"></a>8. 客户端发送JWT进行后续请求</h3><p>对于需要认证的后续请求，客户端需要在HTTP请求的<code>Authorization</code>头部中包含JWT。例如：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Authorization: Bearer <span class="tag">&lt;<span class="name">your-jwt-token</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="9-服务器端验证JWT"><a href="#9-服务器端验证JWT" class="headerlink" title="9. 服务器端验证JWT"></a>9. 服务器端验证JWT</h3><p>服务器端的一个拦截器（如<code>JwtInterceptor</code>）会拦截请求，并从<code>Authorization</code>头部中提取JWT。然后，拦截器会验证JWT的有效性，包括签名、过期时间等。</p><h2 id="5、实战"><a href="#5、实战" class="headerlink" title="5、实战"></a>5、实战</h2><h3 id="1、准备工作"><a href="#1、准备工作" class="headerlink" title="1、准备工作"></a>1、准备工作</h3><p>搭建一个SpringBoot工程</p><h4 id="1-1、项目结构"><a href="#1-1、项目结构" class="headerlink" title="1.1、项目结构"></a>1.1、项目结构</h4><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">src/</span><br><span class="line">|<span class="string">-- main/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">-- java/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- com.yourcompany.project/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- controller/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- UserController.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- entity/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- User.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- Result.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- MyUserDetails.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- repository/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- UserRepository.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- service/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- impl/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- UserServiceImpl.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- UserService.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- config/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- WebSecurityConfig.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- WebConfig.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- RedisConfig.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- util/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- JwtUtil.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- RedisUtil.java</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- interceptor/</span></span><br><span class="line"><span class="string"></span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">   </span>|<span class="string">-- JwtInterceptor.java</span></span><br></pre></td></tr></table></figure><h3 id="2、添加依赖"><a href="#2、添加依赖" class="headerlink" title="2、添加依赖"></a>2、添加依赖</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- SpringSecurity依赖 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-security<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- JPA依赖 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-data-jpa<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- Redis依赖 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-data-redis<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- JWT依赖 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>io.jsonwebtoken<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>jjwt<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>0.12.3<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- Lombok依赖 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.projectlombok<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>lombok<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">optional</span>&gt;</span>true<span class="tag">&lt;/<span class="name">optional</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="3、配置文件application-yml"><a href="#3、配置文件application-yml" class="headerlink" title="3、配置文件application.yml"></a>3、配置文件application.yml</h3><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line">  <span class="comment"># PostgresSQL配置</span></span><br><span class="line">  <span class="attr">datasource:</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">jdbc:postgresql://127.0.0.1:5432/test</span> <span class="comment"># 配置数据库</span></span><br><span class="line">    <span class="attr">username:</span> <span class="string">natuie</span></span><br><span class="line">    <span class="attr">password:</span> <span class="string">xxxxxx</span></span><br><span class="line">    <span class="attr">driver-class-name:</span> <span class="string">org.postgresql.Driver</span></span><br><span class="line">  <span class="attr">jpa:</span></span><br><span class="line">    <span class="attr">show-sql:</span> <span class="literal">true</span> <span class="comment"># 在控制台打印执行的SQL语句</span></span><br><span class="line">    <span class="attr">hibernate:</span></span><br><span class="line">      <span class="attr">ddl-auto:</span> <span class="string">update</span> <span class="comment"># 指定为update，每次启动项目因表结构变化就会更新/新增字段，表不存在时会新建，如果指定create，则每次启动项目都会清空数据并删除表，再新建</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Redis配置</span></span><br><span class="line">  <span class="attr">data:</span></span><br><span class="line">    <span class="attr">redis:</span></span><br><span class="line">      <span class="attr">host:</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span></span><br><span class="line">      <span class="comment"># Redis服务器连接端口</span></span><br><span class="line">      <span class="attr">port:</span> <span class="number">6379</span></span><br><span class="line">      <span class="comment"># Redis服务器连接密码（默认为空）</span></span><br><span class="line">      <span class="comment"># password:</span></span><br><span class="line">      <span class="comment"># 连接池最大连接数（使用负值表示没有限制）</span></span><br><span class="line">      <span class="attr">pool:</span></span><br><span class="line">        <span class="attr">max-active:</span> <span class="number">8</span></span><br><span class="line">        <span class="comment"># 连接池最大阻塞等待时间（使用负值表示没有限制）</span></span><br><span class="line">        <span class="attr">max-wait:</span> <span class="number">-1</span></span><br><span class="line">        <span class="comment"># 连接池中的最大空闲连接</span></span><br><span class="line">        <span class="attr">max-idle:</span> <span class="number">8</span></span><br><span class="line">        <span class="comment"># 连接池中的最小空闲连接</span></span><br><span class="line">        <span class="attr">min-idle:</span> <span class="number">0</span></span><br><span class="line">      <span class="comment"># 连接超时时间（毫秒）</span></span><br><span class="line">      <span class="attr">timeout:</span> <span class="number">30000</span></span><br><span class="line">  <span class="attr">jackson:</span></span><br><span class="line">    <span class="comment">#日期类型格式化</span></span><br><span class="line">    <span class="attr">date-format:</span> <span class="string">yyyy-MM-dd</span> <span class="string">HH:mm:ss</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jwt:</span></span><br><span class="line">  <span class="attr">secret:</span> <span class="string">rlFgiCr2rRMch/bTWYbz=p8IY/Rj8oQdcu2zpj1/SQzrE=</span> <span class="comment"># 密钥，一定要&gt;=256bit，不是256长度，&gt;=32位长度就行，不然报错</span></span><br><span class="line">  <span class="attr">expiration:</span> <span class="number">259200000</span> <span class="comment"># 3天过期时间</span></span><br></pre></td></tr></table></figure><h3 id="4、创建Controller：处理HTTP请求，如用户注册和登录"><a href="#4、创建Controller：处理HTTP请求，如用户注册和登录" class="headerlink" title="4、创建Controller：处理HTTP请求，如用户注册和登录"></a>4、创建Controller：处理HTTP请求，如用户注册和登录</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="meta">@RequestMapping(&quot;/auth&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UserController</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span>  <span class="keyword">final</span> UserService userService;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">UserController</span><span class="params">(UserService userService)</span>&#123;</span><br><span class="line">        <span class="built_in">this</span>.userService = userService;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@PostMapping(&quot;/login&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> Result&lt;Object&gt; <span class="title function_">login</span><span class="params">(User user)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> userService.login(user);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@PostMapping(&quot;/register&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> Result&lt;Object&gt; <span class="title function_">register</span><span class="params">(User user)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> userService.register(user);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="5、创建User实体类：定义用户实体，包含用户信息如用户名、密码等"><a href="#5、创建User实体类：定义用户实体，包含用户信息如用户名、密码等" class="headerlink" title="5、创建User实体类：定义用户实体，包含用户信息如用户名、密码等"></a>5、创建User实体类：定义用户实体，包含用户信息如用户名、密码等</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@NoArgsConstructor</span></span><br><span class="line"><span class="meta">@Entity</span></span><br><span class="line"><span class="meta">@Table(name = &quot;userdata&quot;)</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">User</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Id</span></span><br><span class="line">    <span class="meta">@GeneratedValue(strategy = GenerationType.IDENTITY)</span> <span class="comment">// ID 是自增的</span></span><br><span class="line">    <span class="keyword">private</span> Long id; <span class="comment">// 主键</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(length = 18, nullable = false, unique = true)</span></span><br><span class="line">    <span class="keyword">private</span> String account; <span class="comment">// 账号</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(length = 64, nullable = false)</span></span><br><span class="line">    <span class="keyword">private</span> String password; <span class="comment">// 密码</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(length = 13, unique = true)</span></span><br><span class="line">    <span class="keyword">private</span> String mobileNumber; <span class="comment">// 手机号</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(length = 128, nullable = false,unique = true)</span></span><br><span class="line">    <span class="keyword">private</span> String email; <span class="comment">// 邮箱</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(length = 36, nullable = false)</span></span><br><span class="line">    <span class="keyword">private</span> String username; <span class="comment">// 用户名</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Temporal(TemporalType.TIMESTAMP)</span></span><br><span class="line">    <span class="meta">@DateTimeFormat(pattern = &quot;yyyy-MM-dd HH:mm:ss&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> Date registerTime; <span class="comment">// 注册时间</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> String identity; <span class="comment">// 身份信息，会员等</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> String state; <span class="comment">// 状态，正常、冻结等</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> Short sex; <span class="comment">// 性别，0：中，1：男，2：女</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Temporal(TemporalType.DATE)</span></span><br><span class="line">    <span class="keyword">private</span> Date birthDate; <span class="comment">// 生日</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> String address; <span class="comment">// 地址</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> BigDecimal money; <span class="comment">// 余额</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(length = 255)</span></span><br><span class="line">    <span class="keyword">private</span> String registerInfo; <span class="comment">// 注册信息</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="6、创建Result实体类：用于数据返回"><a href="#6、创建Result实体类：用于数据返回" class="headerlink" title="6、创建Result实体类：用于数据返回"></a>6、创建Result实体类：用于数据返回</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@JsonInclude(JsonInclude.Include.NON_NULL)</span> <span class="comment">// Ignore null values when serializing to JSON</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@Setter</span></span><br><span class="line"><span class="meta">@Getter</span></span><br><span class="line"><span class="meta">@ToString</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Result</span>&lt;T&gt; &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> code;</span><br><span class="line">    <span class="keyword">private</span> String message;</span><br><span class="line">    <span class="keyword">private</span> T data;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Result</span><span class="params">(<span class="type">int</span> code, String message, T data)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.code = code;</span><br><span class="line">        <span class="built_in">this</span>.message = message;</span><br><span class="line">        <span class="built_in">this</span>.data = data;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;E&gt; Result&lt;E&gt; <span class="title function_">success</span><span class="params">(String message)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Result</span>&lt;&gt;(<span class="number">200</span>, message, <span class="literal">null</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;E&gt; Result&lt;E&gt; <span class="title function_">success</span><span class="params">(<span class="type">int</span> code, String message)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Result</span>&lt;&gt;(code, message, <span class="literal">null</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;E&gt; Result&lt;E&gt; <span class="title function_">success</span><span class="params">(E data)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Result</span>&lt;&gt;(<span class="number">200</span>, <span class="literal">null</span>, data);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;E&gt; Result&lt;E&gt; <span class="title function_">success</span><span class="params">(String message, E data)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Result</span>&lt;&gt;(<span class="number">200</span>, message, data);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;E&gt; Result&lt;E&gt; <span class="title function_">error</span><span class="params">(String message)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Result</span>&lt;&gt;(<span class="number">201</span>, message, <span class="literal">null</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;E&gt; Result&lt;E&gt; <span class="title function_">error</span><span class="params">(<span class="type">int</span> code, String message)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Result</span>&lt;&gt;(code, message, <span class="literal">null</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="7、创建JpaRepository接口：用于访问数据库中的用户数据"><a href="#7、创建JpaRepository接口：用于访问数据库中的用户数据" class="headerlink" title="7、创建JpaRepository接口：用于访问数据库中的用户数据"></a>7、创建JpaRepository接口：用于访问数据库中的用户数据</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">UserRepository</span> <span class="keyword">extends</span> <span class="title class_">JpaRepository</span>&lt;User, Integer&gt; &#123;</span><br><span class="line">    User <span class="title function_">findByAccount</span><span class="params">(String account)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="8、自定义UserDetailsService"><a href="#8、自定义UserDetailsService" class="headerlink" title="8、自定义UserDetailsService"></a>8、自定义UserDetailsService</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyUserDetailsService</span> <span class="keyword">implements</span> <span class="title class_">UserDetailsService</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> UserRepository userRepository;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">MyUserDetailsService</span><span class="params">(UserRepository userRepository)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.userRepository = userRepository;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> UserDetails <span class="title function_">loadUserByUsername</span><span class="params">(String username)</span> <span class="keyword">throws</span> UsernameNotFoundException &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;loadUserByUsername: &quot;</span> + username);</span><br><span class="line">        <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span>  userRepository.findByAccount(username);</span><br><span class="line">        <span class="keyword">if</span> (user == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">UsernameNotFoundException</span>(<span class="string">&quot;User not found with username: &quot;</span> + username);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">MyUserDetails</span>(user);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="9、创建用户业务UserService接口：定义用户服务接口"><a href="#9、创建用户业务UserService接口：定义用户服务接口" class="headerlink" title="9、创建用户业务UserService接口：定义用户服务接口"></a>9、创建用户业务UserService接口：定义用户服务接口</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">UserService</span> &#123;</span><br><span class="line">    Result&lt;Object&gt; <span class="title function_">login</span><span class="params">(User user)</span>;</span><br><span class="line">    Result&lt;Object&gt; <span class="title function_">register</span><span class="params">(User user)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="10、创建用户业务实现UserServiceImpl接口：实现用户服务接口，处理用户注册和登录逻辑"><a href="#10、创建用户业务实现UserServiceImpl接口：实现用户服务接口，处理用户注册和登录逻辑" class="headerlink" title="10、创建用户业务实现UserServiceImpl接口：实现用户服务接口，处理用户注册和登录逻辑"></a>10、创建用户业务实现UserServiceImpl接口：实现用户服务接口，处理用户注册和登录逻辑</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@SuppressWarnings(value = &#123; &quot;unchecked&quot;, &quot;rawtypes&quot; &#125;)</span></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UserServiceImpl</span> <span class="keyword">implements</span> <span class="title class_">UserService</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> AuthenticationManager authenticationManager;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> RedisUtil redisUtil;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> JwtUtil jwtUtil;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> UserRepository userRepository;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">UserServiceImpl</span><span class="params">(AuthenticationManager authenticationManager, RedisUtil redisUtil,</span></span><br><span class="line"><span class="params">                           JwtUtil jwtUtil, UserRepository userRepository)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.authenticationManager = authenticationManager;</span><br><span class="line">        <span class="built_in">this</span>.redisUtil = redisUtil;</span><br><span class="line">        <span class="built_in">this</span>.jwtUtil = jwtUtil;</span><br><span class="line">        <span class="built_in">this</span>.userRepository = userRepository;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> Result&lt;Object&gt; <span class="title function_">login</span><span class="params">(<span class="meta">@RequestBody</span> User user)</span> &#123;</span><br><span class="line">        <span class="type">UsernamePasswordAuthenticationToken</span> <span class="variable">authenticationToken</span> <span class="operator">=</span></span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">UsernamePasswordAuthenticationToken</span>(user.getAccount(),user.getPassword());</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// 认证</span></span><br><span class="line">            <span class="type">Authentication</span> <span class="variable">authenticate</span> <span class="operator">=</span> authenticationManager.authenticate(authenticationToken);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 生成JWT</span></span><br><span class="line">            <span class="type">MyUserDetails</span> <span class="variable">loginUser</span> <span class="operator">=</span> (MyUserDetails) authenticate.getPrincipal();</span><br><span class="line">            <span class="type">String</span> <span class="variable">jwt</span> <span class="operator">=</span> jwtUtil.generateToken(loginUser.getUser());</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 保存到Redis</span></span><br><span class="line">            Map&lt;String,String&gt; map = Map.ofEntries(Map.entry(<span class="string">&quot;token&quot;</span>, jwt));</span><br><span class="line">            redisUtil.hmset(<span class="string">&quot;TOKEN_&quot;</span> + jwt, map, jwtUtil.getExpirationTime());</span><br><span class="line">            <span class="keyword">return</span> Result.success(<span class="string">&quot;登陆成功！&quot;</span>, jwt);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (BadCredentialsException e) &#123;</span><br><span class="line">            <span class="comment">// 凭证无效，返回错误信息</span></span><br><span class="line">            <span class="keyword">return</span> Result.error(<span class="string">&quot;凭据无效！&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (AuthenticationException e) &#123;</span><br><span class="line">            <span class="comment">// 其他认证错误，返回错误信息</span></span><br><span class="line">            <span class="keyword">return</span> Result.error(<span class="string">&quot;认证失败！&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> Result&lt;Object&gt; <span class="title function_">register</span><span class="params">(<span class="meta">@RequestBody</span> User user)</span> &#123;</span><br><span class="line">        <span class="comment">// 可以写一些检测逻辑，比如账号是否已存在，密码是否符合要求等等</span></span><br><span class="line"></span><br><span class="line">        <span class="type">User</span> <span class="variable">newUser</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>();</span><br><span class="line">        newUser.setAccount(user.getAccount());</span><br><span class="line">        newUser.setPassword(user.getPassword());</span><br><span class="line">        newUser.setEmail(user.getEmail());</span><br><span class="line">        newUser.setRegisterTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line">        userRepository.save(newUser);</span><br><span class="line">        <span class="keyword">return</span> Result.success(<span class="string">&quot;注册成功！&quot;</span>);</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><h3 id="11、创建WebSecurityConfig配置文件：配置Spring-Security，定义安全规则"><a href="#11、创建WebSecurityConfig配置文件：配置Spring-Security，定义安全规则" class="headerlink" title="11、创建WebSecurityConfig配置文件：配置Spring Security，定义安全规则"></a>11、创建WebSecurityConfig配置文件：配置Spring Security，定义安全规则</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@EnableWebSecurity</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebSecurityConfig</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="keyword">public</span> SecurityFilterChain <span class="title function_">securityFilterChain</span><span class="params">(HttpSecurity http)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        http</span><br><span class="line">                .authorizeHttpRequests((authorize) -&gt; authorize</span><br><span class="line">                        <span class="comment">// 放行登录,注册页面</span></span><br><span class="line">                        .requestMatchers(<span class="string">&quot;/auth/login&quot;</span>, <span class="string">&quot;/auth/register&quot;</span>).permitAll()</span><br><span class="line">                        <span class="comment">// 拦截其他所有请求</span></span><br><span class="line">                        .anyRequest().authenticated()</span><br><span class="line">                )</span><br><span class="line">                .httpBasic(Customizer.withDefaults())</span><br><span class="line">                .formLogin(Customizer.withDefaults())</span><br><span class="line">                .cors(AbstractHttpConfigurer::disable)</span><br><span class="line">                .csrf(AbstractHttpConfigurer::disable);</span><br><span class="line">        <span class="keyword">return</span> http.build();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="keyword">public</span> PasswordEncoder <span class="title function_">passwordEncoder</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">BCryptPasswordEncoder</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="keyword">public</span> AuthenticationManager <span class="title function_">authenticationManager</span><span class="params">(MyUserDetailsService userService, PasswordEncoder passwordEncoder)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">DaoAuthenticationProvider</span> <span class="variable">provider</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DaoAuthenticationProvider</span>();</span><br><span class="line">        provider.setUserDetailsService(userService);</span><br><span class="line">        provider.setPasswordEncoder(passwordEncoder);</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">ProviderManager</span>(provider);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="12、创建WebConfig配置文件：配置拦截器"><a href="#12、创建WebConfig配置文件：配置拦截器" class="headerlink" title="12、创建WebConfig配置文件：配置拦截器"></a>12、创建WebConfig配置文件：配置拦截器</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebConfig</span> <span class="keyword">implements</span> <span class="title class_">WebMvcConfigurer</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> JwtInterceptor jwtInterceptor;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">WebConfig</span><span class="params">(JwtInterceptor jwtInterceptor)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.jwtInterceptor = jwtInterceptor;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addInterceptors</span><span class="params">(InterceptorRegistry registry)</span> &#123;</span><br><span class="line">        registry.addInterceptor(jwtInterceptor)</span><br><span class="line">                .addPathPatterns(<span class="string">&quot;/**&quot;</span>) <span class="comment">// 拦截的请求</span></span><br><span class="line">                .excludePathPatterns(<span class="string">&quot;/auth/login&quot;</span>, <span class="string">&quot;/auth/register&quot;</span>); <span class="comment">// 不拦截的请求</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="13、创建JwtInterceptor过滤器-：拦截请求并验证JWT"><a href="#13、创建JwtInterceptor过滤器-：拦截请求并验证JWT" class="headerlink" title="13、创建JwtInterceptor过滤器:：拦截请求并验证JWT"></a>13、创建JwtInterceptor过滤器:：拦截请求并验证JWT</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JwtInterceptor</span> <span class="keyword">implements</span> <span class="title class_">HandlerInterceptor</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> JwtUtil jwtUtil;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">JwtInterceptor</span><span class="params">(JwtUtil jwtUtil)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.jwtUtil = jwtUtil;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">preHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">if</span> (!request.getMethod().equalsIgnoreCase(<span class="string">&quot;OPTIONS&quot;</span>)) &#123;</span><br><span class="line">            <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> request.getHeader(<span class="string">&quot;Authorization&quot;</span>); <span class="comment">// 获取请求头中的token</span></span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                jwtUtil.parseJWT(token);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (SignatureException e) &#123;</span><br><span class="line">                <span class="keyword">return</span> unauthorized(request, response, Result.error(<span class="string">&quot;无效签名&quot;</span>));</span><br><span class="line">            &#125; <span class="keyword">catch</span> (UnsupportedJwtException e) &#123;</span><br><span class="line">                <span class="keyword">return</span> unauthorized(request, response, Result.error(<span class="string">&quot;不支持的签名&quot;</span>));</span><br><span class="line">            &#125; <span class="keyword">catch</span> (ExpiredJwtException e) &#123;</span><br><span class="line">                <span class="keyword">return</span> unauthorized(request, response, Result.error(<span class="string">&quot;token过期&quot;</span>));</span><br><span class="line">            &#125; <span class="keyword">catch</span> (MalformedJwtException e) &#123; <span class="comment">// IllegalArgumentException</span></span><br><span class="line">                <span class="keyword">return</span> unauthorized(request, response, Result.error(<span class="string">&quot;不支持的签名格式&quot;</span>));</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                <span class="keyword">return</span> unauthorized(request, response, Result.error(<span class="string">&quot;token无效&quot;</span>));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>; <span class="comment">// 通过所有OPTION请求</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="type">boolean</span> <span class="title function_">unauthorized</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Result&lt;String&gt; result)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">json</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectMapper</span>().writeValueAsString(result);</span><br><span class="line">        response.setStatus(<span class="number">401</span>);</span><br><span class="line">        response.setContentType(<span class="string">&quot;application/json;charset=UTF-8&quot;</span>);</span><br><span class="line">        response.getWriter().println(json);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="14、创建RedisConfig配置文件：添加Bean用于RedisTemplate序列化配置，避免直接使用出现乱码"><a href="#14、创建RedisConfig配置文件：添加Bean用于RedisTemplate序列化配置，避免直接使用出现乱码" class="headerlink" title="14、创建RedisConfig配置文件：添加Bean用于RedisTemplate序列化配置，避免直接使用出现乱码"></a>14、创建RedisConfig配置文件：添加Bean用于RedisTemplate序列化配置，避免直接使用出现乱码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RedisConfig</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean(&quot;redisTemplate&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> RedisTemplate&lt;String, Object&gt; <span class="title function_">redisTemplate</span><span class="params">(RedisConnectionFactory factory)</span> &#123;</span><br><span class="line">        RedisTemplate&lt;String, Object&gt; template = <span class="keyword">new</span> <span class="title class_">RedisTemplate</span>&lt;&gt;();</span><br><span class="line">        template.setConnectionFactory(factory);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">//Json序列化配置</span></span><br><span class="line">        Jackson2JsonRedisSerializer&lt;Object&gt; Jackson2JsonRedisSerializer = <span class="keyword">new</span> <span class="title class_">Jackson2JsonRedisSerializer</span>&lt;&gt;(Object.class);</span><br><span class="line">        <span class="type">ObjectMapper</span> <span class="variable">mp</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectMapper</span>();</span><br><span class="line">        mp.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);</span><br><span class="line">        mp.activateDefaultTyping(mp.getPolymorphicTypeValidator());</span><br><span class="line">        Jackson2JsonRedisSerializer.serialize(mp);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//Spring的序列化</span></span><br><span class="line">        <span class="type">StringRedisSerializer</span> <span class="variable">stringRedisSerializer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringRedisSerializer</span>();</span><br><span class="line">        <span class="comment">//key采用String的序列化方式</span></span><br><span class="line">        template.setKeySerializer(stringRedisSerializer);</span><br><span class="line">        <span class="comment">//hash的key也采用string的序列化方式</span></span><br><span class="line">        template.setHashKeySerializer(stringRedisSerializer);</span><br><span class="line">        <span class="comment">//value的序列化方式采用的是jackson</span></span><br><span class="line">        template.setValueSerializer(Jackson2JsonRedisSerializer);</span><br><span class="line">        <span class="comment">//hash的value序列化方式采用jackson</span></span><br><span class="line">        template.setHashValueSerializer(Jackson2JsonRedisSerializer);</span><br><span class="line">        <span class="comment">// 设置其他的k-v的默认的序列化</span></span><br><span class="line">        template.setDefaultSerializer(Jackson2JsonRedisSerializer);</span><br><span class="line">        template.afterPropertiesSet();</span><br><span class="line">        <span class="keyword">return</span> template;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="15、创建Redis工具类"><a href="#15、创建Redis工具类" class="headerlink" title="15、创建Redis工具类"></a>15、创建Redis工具类</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@SuppressWarnings(value = &#123; &quot;unchecked&quot;, &quot;rawtypes&quot; &#125;)</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">RedisUtil</span>&lt;K, V&gt; &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> RedisTemplate redisTemplate;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">RedisUtil</span><span class="params">(RedisTemplate redisTemplate)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.redisTemplate = redisTemplate;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 指定缓存失效时间</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key  键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> time 时间(秒)</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">expire</span><span class="params">(String key, <span class="type">long</span> time)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (time &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                redisTemplate.expire(key, time, TimeUnit.SECONDS);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 根据key 获取过期时间</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键 不能为null</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 时间(秒) 返回0代表为永久有效</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">getExpire</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.getExpire(key, TimeUnit.SECONDS);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 判断key是否存在</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true 存在 false不存在</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">hasKey</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.hasKey(key);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 删除缓存</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 可以传一个值 或多个</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@SuppressWarnings(&quot;unchecked&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">del</span><span class="params">(String... key)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (key != <span class="literal">null</span> &amp;&amp; key.length &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (key.length == <span class="number">1</span>) &#123;</span><br><span class="line">                redisTemplate.delete(key[<span class="number">0</span>]);</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                redisTemplate.delete((Collection&lt;String&gt;) CollectionUtils.arrayToList(key));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">// ============================String=============================</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 普通缓存获取</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 值</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> Object <span class="title function_">get</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> key == <span class="literal">null</span> ? <span class="literal">null</span> : redisTemplate.opsForValue().get(key);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 普通缓存放入</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true成功 false失败</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">set</span><span class="params">(String key, Object value)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForValue().set(key, value);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 普通缓存放入并设置时间</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> time  时间(秒) time要大于0 如果time小于等于0 将设置无限期</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true成功 false 失败</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">set</span><span class="params">(String key, Object value, <span class="type">long</span> time)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (time &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                redisTemplate.opsForValue().set(key, value, time, TimeUnit.MINUTES);</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                set(key, value);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 递增</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> delta 要增加几(大于0)</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">incr</span><span class="params">(String key, <span class="type">long</span> delta)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (delta &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">&quot;递增因子必须大于0&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.opsForValue().increment(key, delta);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 递减</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> delta 要减少几(小于0)</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">decr</span><span class="params">(String key, <span class="type">long</span> delta)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (delta &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">&quot;递减因子必须大于0&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.opsForValue().increment(key, -delta);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">// ================================Map=================================</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * HashGet</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key  键 不能为null</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> item 项 不能为null</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> Object <span class="title function_">hget</span><span class="params">(String key, String item)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.opsForHash().get(key, item);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取hashKey对应的所有键值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 对应的多个键值</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> Map&lt;K, V&gt;  <span class="title function_">hmget</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.opsForHash().entries(key);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * HashSet</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> map 对应多个键值</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">hmset</span><span class="params">(String key, Map&lt;?, ?&gt; map)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForHash().putAll(key, map);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * HashSet 并设置时间</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key  键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> map  对应多个键值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> time 时间(秒)</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true成功 false失败</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">hmset</span><span class="params">(String key, Map&lt;?, ?&gt; map, <span class="type">long</span> time)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForHash().putAll(key, map);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (time &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                expire(key, time);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 向一张hash表中放入数据,如果不存在将创建</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> item  项</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true 成功 false失败</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">hset</span><span class="params">(String key, String item, Object value)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForHash().put(key, item, value);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 向一张hash表中放入数据,如果不存在将创建</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> item  项</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true 成功 false失败</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">hset</span><span class="params">(String key, String item, Object value, <span class="type">long</span> time)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForHash().put(key, item, value);</span><br><span class="line">            <span class="keyword">if</span> (time &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                expire(key, time);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 删除hash表中的值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key  键 不能为null</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> item 项 可以使多个 不能为null</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hdel</span><span class="params">(String key, Object... item)</span> &#123;</span><br><span class="line">        redisTemplate.opsForHash().delete(key, item);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 判断hash表中是否有该项的值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key  键 不能为null</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> item 项 不能为null</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true 存在 false不存在</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">hHasKey</span><span class="params">(String key, String item)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.opsForHash().hasKey(key, item);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * hash递增 如果不存在,就会创建一个 并把新增后的值返回</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key  键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> item 项</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> by   要增加几(大于0)</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">double</span> <span class="title function_">hincr</span><span class="params">(String key, String item, <span class="type">double</span> by)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.opsForHash().increment(key, item, by);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * hash递减</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key  键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> item 项</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> by   要减少记(小于0)</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">double</span> <span class="title function_">hdecr</span><span class="params">(String key, String item, <span class="type">double</span> by)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> redisTemplate.opsForHash().increment(key, item, -by);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">// ============================set=============================</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 根据key获取Set中的所有值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> Set&lt;Object&gt; <span class="title function_">sGet</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.opsForSet().members(key);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 根据value从一个set中查询,是否存在</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> true 存在 false不存在</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">sHasKey</span><span class="params">(String key, Object value)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.opsForSet().isMember(key, value);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 将数据放入set缓存</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key    键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> values 值 可以是多个</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 成功个数</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">sSet</span><span class="params">(String key, Object... values)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.opsForSet().add(key, values);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 将set数据放入缓存</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key    键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> time   时间(秒)</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> values 值 可以是多个</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 成功个数</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">sSetAndTime</span><span class="params">(String key, <span class="type">long</span> time, Object... values)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Long</span> <span class="variable">count</span> <span class="operator">=</span> redisTemplate.opsForSet().add(key, values);</span><br><span class="line">            <span class="keyword">if</span> (time &gt; <span class="number">0</span>)</span><br><span class="line">                expire(key, time);</span><br><span class="line">            <span class="keyword">return</span> count;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取set缓存的长度</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">getSetSize</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.opsForSet().size(key);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 移除值为value的</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key    键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> values 值 可以是多个</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 移除的个数</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">setRemove</span><span class="params">(String key, Object... values)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Long</span> <span class="variable">count</span> <span class="operator">=</span> redisTemplate.opsForSet().remove(key, values);</span><br><span class="line">            <span class="keyword">return</span> count;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ===============================list=================================</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取list缓存的内容</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> start 开始</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> end   结束 0 到 -1代表所有值</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> List&lt;Object&gt; <span class="title function_">lGet</span><span class="params">(String key, <span class="type">long</span> start, <span class="type">long</span> end)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.opsForList().range(key, start, end);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取list缓存的长度</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key 键</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">getListSize</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.opsForList().size(key);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 通过索引 获取list中的值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> index 索引 index&gt;=0时， 0 表头，1 第二个元素，依次类推；index&lt;0时，-1，表尾，-2倒数第二个元素，依次类推</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> Object <span class="title function_">lGetIndex</span><span class="params">(String key, <span class="type">long</span> index)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> redisTemplate.opsForList().index(key, index);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 将list放入缓存</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">lSet</span><span class="params">(String key, Object value)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForList().rightPush(key, value);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 将list放入缓存</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> time  时间(秒)</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">lSet</span><span class="params">(String key, Object value, <span class="type">long</span> time)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForList().rightPush(key, value);</span><br><span class="line">            <span class="keyword">if</span> (time &gt; <span class="number">0</span>)</span><br><span class="line">                expire(key, time);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 将list放入缓存</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">lSet</span><span class="params">(String key, List&lt;Object&gt; value)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForList().rightPushAll(key, value);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 将list放入缓存</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> time  时间(秒)</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">lSet</span><span class="params">(String key, List&lt;Object&gt; value, <span class="type">long</span> time)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForList().rightPushAll(key, value);</span><br><span class="line">            <span class="keyword">if</span> (time &gt; <span class="number">0</span>)</span><br><span class="line">                expire(key, time);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 根据索引修改list中的某条数据</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> index 索引</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">lUpdateIndex</span><span class="params">(String key, <span class="type">long</span> index, Object value)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            redisTemplate.opsForList().set(key, index, value);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 移除N个值为value</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> key   键</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> count 移除多少个</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> value 值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 移除的个数</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">lRemove</span><span class="params">(String key, <span class="type">long</span> count, Object value)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Long</span> <span class="variable">remove</span> <span class="operator">=</span> redisTemplate.opsForList().remove(key, count, value);</span><br><span class="line">            <span class="keyword">return</span> remove;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="16、创建JWT工具类"><a href="#16、创建JWT工具类" class="headerlink" title="16、创建JWT工具类"></a>16、创建JWT工具类</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@Getter</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JwtUtil</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> String secretKey;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> expirationTime; <span class="comment">// 3 days</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Value(&quot;$&#123;jwt.secret&#125;&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">setSecretKey</span><span class="params">(String secretKey)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.secretKey = secretKey;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Value(&quot;$&#123;jwt.expiration&#125;&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">setExpirationTime</span><span class="params">(<span class="type">int</span> expirationTime)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.expirationTime = expirationTime;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> SecretKey <span class="title function_">key</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Keys.hmacShaKeyFor(secretKey.getBytes());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">generateToken</span><span class="params">(User user)</span> &#123;</span><br><span class="line">        System.out.println(secretKey);</span><br><span class="line">        <span class="keyword">return</span> Jwts.builder()</span><br><span class="line">                .id(String.valueOf(user.getId()))</span><br><span class="line">                .subject(user.getUsername()) <span class="comment">// 主题</span></span><br><span class="line">                .issuedAt(<span class="keyword">new</span> <span class="title class_">Date</span>()) <span class="comment">// 签发时间</span></span><br><span class="line">                .issuer(<span class="string">&quot;Natuie&quot;</span>)</span><br><span class="line">                .claim(<span class="string">&quot;account&quot;</span>, user.getAccount()) <span class="comment">// 账号</span></span><br><span class="line">                .claim(<span class="string">&quot;email&quot;</span>, user.getEmail()) <span class="comment">// 邮箱</span></span><br><span class="line">                .expiration(<span class="keyword">new</span> <span class="title class_">Date</span>(System.currentTimeMillis() + expirationTime)) <span class="comment">// 过期时间</span></span><br><span class="line">                .signWith(key()) <span class="comment">// 签名</span></span><br><span class="line">                .compact(); <span class="comment">// 压缩</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Jws&lt;Claims&gt; <span class="title function_">parseJWT</span><span class="params">(String token)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Jwts.parser()</span><br><span class="line">                .verifyWith(key()).build()</span><br><span class="line">                .parseSignedClaims(token); <span class="comment">// 验证并解析</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">validateToken</span><span class="params">(String token)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            parseJWT(token);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (ExpiredJwtException e) &#123;</span><br><span class="line">            <span class="comment">// Token过期</span></span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="6、运行"><a href="#6、运行" class="headerlink" title="6、运行"></a>6、运行</h2><p>发送POST请求到<code>/auth/register</code>然后请求到<code>/auth/login</code>，可以发现返回JWT数据，那就成功了。</p>]]></content>
    
    
    <summary type="html">在现代Web应用开发中，安全是一个至关重要的方面。本文将介绍如何将Spring Boot 3、PostgreSQL数据库、JPA、Spring Security 6.3、Redis和JWT整合在一起，实现一个安全的用户认证和授权系统。</summary>
    
    
    
    <category term="SpringBoot" scheme="https://blog.natuie.net/categories/SpringBoot/"/>
    
    
  </entry>
  
  <entry>
    <title>SpringBoot 中整合 Thymeleaf 无法直接访问templates下的html文件的解决方法</title>
    <link href="https://blog.natuie.net/posts/2024/08/10/223719/"/>
    <id>https://blog.natuie.net/posts/2024/08/10/223719/</id>
    <published>2024-08-10T14:37:19.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h2 id="问题自述"><a href="#问题自述" class="headerlink" title="问题自述"></a>问题自述</h2><p>看着教程一步一步学，发现我写的控制器，访问打开返回一个字符串而不是html文件内容，我就纳闷了，明明没问题，可是一直没用。</p><h2 id="Controller和RestController的主要区别"><a href="#Controller和RestController的主要区别" class="headerlink" title="Controller和RestController的主要区别"></a><code>Controller</code>和<code>RestController</code>的主要区别</h2><p><code>Controller</code>和<code>RestController</code>的主要区别在于它们处理返回值的方式：</p><ul><li><code>@Controller</code>：用于返回视图名称，适合传统的MVC模式，返回的是HTML页面。</li><li><code>@RestController</code>：用于构建RESTful服务，直接返回数据（如JSON或XML），不返回视图名称。</li></ul><h2 id="解决问题"><a href="#解决问题" class="headerlink" title="解决问题"></a>解决问题</h2><p>看到这，因为我写控制器是无脑写<code>RestController</code>，所以导致这样。改掉就好了。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Controller</span> <span class="comment">// 重点！！！</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ThymeleafController</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@GetMapping(&quot;/login&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">login</span><span class="params">()</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;login&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果还是没用，你注意检查一下，你的html文件是不是在**.\resources\templates**这里面。</p><p>也可以尝试修改静态资源的位置，通常不需要修改。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line">  <span class="attr">mvc:</span></span><br><span class="line">    <span class="attr">static-path-pattern:</span> <span class="string">/static/**</span></span><br><span class="line">  <span class="attr">web:</span></span><br><span class="line">    <span class="attr">resources:</span></span><br><span class="line">      <span class="attr">static-locations:</span> <span class="string">classpath:/static/</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">厘清Controller和RestController的主要区别并解决Thymeleaf无法直接访问templates下的html文件的解决方法</summary>
    
    
    
    <category term="SpringBoot" scheme="https://blog.natuie.net/categories/SpringBoot/"/>
    
    
    <category term="问题" scheme="https://blog.natuie.net/tags/%E9%97%AE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>SpringBoot3 整合 Security6.3 出现403问题</title>
    <link href="https://blog.natuie.net/posts/2024/08/10/193606/"/>
    <id>https://blog.natuie.net/posts/2024/08/10/193606/</id>
    <published>2024-08-10T11:36:06.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h2 id="问题自述"><a href="#问题自述" class="headerlink" title="问题自述"></a>问题自述</h2><p>在整合Security6.3的时候，我阅读别人写的博客，发现不管怎么样我访问我的接口总是403，登陆接口都进不去，我用的自定义登陆接口。</p><h2 id="HTTP-403-是什么？"><a href="#HTTP-403-是什么？" class="headerlink" title="HTTP 403 是什么？"></a>HTTP 403 是什么？</h2><p>HTTP 403（Forbidden）错误通常表示请求已被服务器理解，但服务器拒绝授权。</p><p>需要注意的是，该错误不同于 401 错误，后者表示服务器需要对客户端进行身份认证，但尚未收到有效凭证。</p><blockquote><p>“401” 表示需要认证，“403” 表示认证过了（或者不需要认证），但是没有权限。</p></blockquote><h2 id="导致403原因"><a href="#导致403原因" class="headerlink" title="导致403原因"></a>导致403原因</h2><ol><li><strong>权限配置问题</strong>：<ul><li>确保你的安全配置正确地定义了哪些用户或角色可以访问哪些资源。例如，使用<code>http.authorizeRequests()</code>方法来配置访问规则。</li></ul></li><li><strong>CSRF保护</strong>：<ul><li>如果你的应用是前后端分离的，可能需要关闭CSRF保护。可以通过配置<code>http.csrf(AbstractHttpConfigurer::disable)</code>来实现。</li></ul></li><li><strong>自定义拦截器或者过滤器</strong>：<ul><li>可能由于配置不当，可以尝试检查一遍</li></ul></li></ol><p>Spring Security 默认启用跨站请求伪造（CSRF）保护。CSRF 是一种通过欺骗受害者提交恶意请求并利用受害者的凭证代表其执行非预期功能的攻击。如果用于防范此类攻击的 CSRF token 丢失或不正确，服务器也可能会响应 403 错误。</p><h2 id="解决-POST-请求中的-403-错误"><a href="#解决-POST-请求中的-403-错误" class="headerlink" title="解决 POST 请求中的 403 错误"></a>解决 POST 请求中的 403 错误</h2><p>默认情况下，Spring Security 会启用 CSRF 保护。如果请求头中缺少 CRSF token，服务器就会响应 403 错误。此行为不针对任何服务器环境，包括 localhost、暂存或生产环境。</p><p>通常我们都会做前后端分离，所以需要禁用CSRF保护，如果你的后端出现这个问题可以看看你是不是这样写的<code>http.csrf(Customizer.withDefaults())</code>，这个其实是启用，默认开启的。</p><p>我们可以通过禁用 CSRF 保护来解决这个问题：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="keyword">public</span> SecurityFilterChain <span class="title function_">securityFilterChain</span><span class="params">(HttpSecurity http)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">    http</span><br><span class="line">            .authorizeHttpRequests((authorize) -&gt; authorize</span><br><span class="line">                    <span class="comment">// 放行登录,注册页面</span></span><br><span class="line">                    .requestMatchers(<span class="string">&quot;/auth/login&quot;</span>, <span class="string">&quot;/auth/register&quot;</span>).permitAll()</span><br><span class="line">                    <span class="comment">// 拦截其他所有请求</span></span><br><span class="line">                    .anyRequest().authenticated()</span><br><span class="line">            )</span><br><span class="line">            .csrf(AbstractHttpConfigurer::disable); <span class="comment">// 禁用CSRF</span></span><br><span class="line">    <span class="keyword">return</span> http.build();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在上面的代码中，我们通过调用 <code>disable()</code> 方法禁用了 CSRF 保护。这里注意，这里的配置不携带凭证（不登陆）是无法访问其他页面的，只能请求注册，登陆。如果想放行所有请求，可以把<code>requestMatchers(&quot;/auth/login&quot;, &quot;/auth/register&quot;)</code>替换为<code>anyRequest()</code>，意为任何请求。</p><p>再次访问可能会出现预期的结果，如果没有，请再次检查你的配置文件。</p><p>不过，需要注意的是，一般不建议在生产环境中禁用 CRSF 保护。CRSF 保护是防止跨站伪造攻击的重要安全措施。因此，建议在状态更改操作的请求头中包含 CRSF token。</p><h3 id="认证凭证"><a href="#认证凭证" class="headerlink" title="认证凭证"></a>认证凭证</h3><p>请求需要认证的端点，但是未提供认证凭证，或者是错误的凭证，都可能会导致 Spring Boot 应用程序出现 403 错误。</p><p>让我们修改 <code>SecurityFilterChain</code>，以对服务器的所有请求进行认证：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="keyword">public</span> SecurityFilterChain <span class="title function_">securityFilterChain</span><span class="params">(HttpSecurity http)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">    http</span><br><span class="line">            .authorizeHttpRequests((authorize) -&gt; authorize</span><br><span class="line">                    <span class="comment">// 放行登录,注册页面</span></span><br><span class="line">                    .requestMatchers(<span class="string">&quot;/auth/login&quot;</span>, <span class="string">&quot;/auth/register&quot;</span>).permitAll()</span><br><span class="line">                    <span class="comment">// 拦截其他所有请求</span></span><br><span class="line">                    .anyRequest().authenticated()</span><br><span class="line">            )</span><br><span class="line">            .httpBasic(Customizer.withDefaults())</span><br><span class="line">            .formLogin(Customizer.withDefaults())</span><br><span class="line">            .cors(AbstractHttpConfigurer::disable)</span><br><span class="line">            .csrf(AbstractHttpConfigurer::disable);</span><br><span class="line">    <span class="keyword">return</span> http.build();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在上面的代码中，我们将应用程序配置为在允许访问前对每个请求进行身份认证。如果我们在未提供正确凭证的情况下向端点发出 POST 请求，服务器将响应 403 错误。</p><p>参考：<a href="https://springdoc.cn/java-spring-fix-403-error/">https://springdoc.cn/java-spring-fix-403-error/</a></p>]]></content>
    
    
    <summary type="html">通过禁用 CRSF 保护和提供正确的身份凭证来解决 Spring Boot 中的 403 错误</summary>
    
    
    
    <category term="SpringBoot" scheme="https://blog.natuie.net/categories/SpringBoot/"/>
    
    
    <category term="问题" scheme="https://blog.natuie.net/tags/%E9%97%AE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>华为天翼网关电信光猫HS8145C获取超级密码以及一些无法上网解决方案</title>
    <link href="https://blog.natuie.net/posts/2024/07/26/124238/"/>
    <id>https://blog.natuie.net/posts/2024/07/26/124238/</id>
    <published>2024-07-26T04:42:38.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前提"><a href="#前提" class="headerlink" title="前提"></a>前提</h2><p><a href="https://dl.natuie.net/local/ONT%E4%BD%BF%E8%83%BD%E5%B7%A5%E5%85%B7218%E7%89%88.zip">下载</a>ONT组播配置工具218版</p><p>拔掉光猫的电源和光纤，<em><strong>切记一定要拔掉！！！</strong></em></p><p>还有这里的光猫不是那个可以活蹦乱跳的猫，他是一个设备！这里的光纤不是与电脑连接的那根线，与电脑连接的线是网线，这两区别是光纤不能导电。光纤是光猫底部那条线，不是侧面的那一排端口。</p><h2 id="ONT使能开启Telnet获取超级密码"><a href="#ONT使能开启Telnet获取超级密码" class="headerlink" title="ONT使能开启Telnet获取超级密码"></a>ONT使能开启Telnet获取超级密码</h2><p><img src="/img/post/PixPin_2024-07-26_14-19-33.png" alt="ONT页面"></p><p>解压然后打开ONT组播配置工具218版.exe这个文件，打开后，在右上角点击设备支持状态。<em><strong>切记一定要拔掉电源和光纤，不然法用！！！</strong></em></p><p><img src="/img/post/PixPin_2024-07-26_14-24-20.png" alt="网卡配置"></p><p>找到网卡选项，选择你的有线网卡，一般名字都是<em>Realtek PCIe FE Family Controller</em>，如果不是，那你找和他长的差不多的，实在不行一个个试，总能找到。其他的不需要改。</p><p><img src="/img/post/PixPin_2024-07-26_14-31-18.png" alt="启动"></p><p>一切准备就绪后点击下面的<em>启动</em>即可。等设备状态（Status）显示Success即可点击停止。然后迅速重启光猫。</p><p>等你的光猫启动好后，快速打开网页，电信就：<em>192.168.1.1</em>，其他<em>192.168.1.0</em>，如果能正常访问就打开<em>超密密文批处理工具.bat</em>这个文件，如果里面的命令没有正常输入到窗口中，可以自行重来，然后快速点击窗口。一直卡在<em>open 192.168.1.1</em>哪里，重启光猫，重新来一遍。</p><p><img src="/img/post/PixPin_2024-07-26_14-39-10.png" alt="命令行"></p><p>如图中的telecomadmin为超管账号，JFKA!YaK为超级密码，复制保存密码。<em><strong>切记：重启光猫！！！</strong></em></p><p>等启动好后，打开<em>192.168.1.1</em>，我的是电信，联通的是<em>192.168.1.0</em>。然后在密码框写入刚刚复制的密码，账号可以直接默认，如果不能登陆就改<em>telecomadmin</em>。最后就成功啦！</p><h2 id="无法上网-问题"><a href="#无法上网-问题" class="headerlink" title="无法上网 问题"></a>无法上网 问题</h2><p>如果出现不能上网问题，多半是DNS让污染了。</p><h3 id="解决DNS问题"><a href="#解决DNS问题" class="headerlink" title="解决DNS问题"></a>解决DNS问题</h3><p>可以自行在你的手机或者电脑设置成静态，配置DNS。</p><p>可以使用这个IPV4的南京信风DNS</p><ul><li>114.114.114.114</li><li>114.114.115.115（备用）</li></ul><p>IPV6的Aliyun DNS</p><ul><li>2400:3200::1</li><li>2400:3200:baba::1（备用）</li></ul><p>也可以使用其他的，我只举出这一个。</p><h3 id="光猫网络配置改错导致"><a href="#光猫网络配置改错导致" class="headerlink" title="光猫网络配置改错导致"></a>光猫网络配置改错导致</h3><p>这边给出我这里能正常上网的配置，我这边建议非专业人士最好不要乱改，这东西很容易上不了网，我就是其中一个例子！！！如果还是要改记得备份你需要修改的配置参数，可以截图，有U盘可以U盘备份。</p><p><img src="/img/post/PixPin_2024-07-26_14-59-09.png" alt="配置1"></p><p><img src="/img/post/PixPin_2024-07-26_15-00-07.png" alt="配置2"></p><p><em><strong>切记：改配置一定要备份，小心上不了网找运营商那就麻烦了！！！</strong></em></p>]]></content>
    
    
    <summary type="html">在华为光猫设备获取超级密码，本文包括了一些解决无法上网的方案，内含正常上网配置参数</summary>
    
    
    
    <category term="网络" scheme="https://blog.natuie.net/categories/%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="光猫" scheme="https://blog.natuie.net/tags/%E5%85%89%E7%8C%AB/"/>
    
    <category term="Telent" scheme="https://blog.natuie.net/tags/Telent/"/>
    
    <category term="华为" scheme="https://blog.natuie.net/tags/%E5%8D%8E%E4%B8%BA/"/>
    
  </entry>
  
  <entry>
    <title>Java中的List对象复制引用问题</title>
    <link href="https://blog.natuie.net/posts/2024/06/06/141925/"/>
    <id>https://blog.natuie.net/posts/2024/06/06/141925/</id>
    <published>2024-06-06T06:19:25.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Java中的List对象复制：深入解析与实例演示"><a href="#Java中的List对象复制：深入解析与实例演示" class="headerlink" title="Java中的List对象复制：深入解析与实例演示"></a>Java中的List对象复制：深入解析与实例演示</h1><p>在Java编程中，对List进行复制是一个常见的需求。然而，复制List并不是一个简单的任务，因为它涉及到浅拷贝和深拷贝的概念。本文将深入探讨Java中复制List的不同方法，并提供详细的实例演示。</p><h2 id="List的复制问题"><a href="#List的复制问题" class="headerlink" title="List的复制问题"></a>List的复制问题</h2><p>在Java中，当你执行<code>list1 = list2</code>时，你实际上是将<code>list1</code>这个引用变量指向了<code>list2</code>所指向的同一个列表对象。这意味着，<code>list1</code>和<code>list2</code>现在是同一个列表对象的两个不同引用。因此，任何对<code>list2</code>的修改都会反映在<code>list1</code>上，因为它们都指向同一个对象。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">List&lt;String&gt; list1 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">list1.add(<span class="string">&quot;Apple&quot;</span>);</span><br><span class="line">list1.add(<span class="string">&quot;Banana&quot;</span>);</span><br><span class="line">List&lt;String&gt; list2 = list1; <span class="comment">// list1 和 list2 现在指向同一个对象</span></span><br><span class="line"><span class="comment">// 修改 list2</span></span><br><span class="line">list2.add(<span class="string">&quot;Cherry&quot;</span>);</span><br><span class="line"><span class="comment">// 打印 list1，可以看到 list1 也发生了变化</span></span><br><span class="line">System.out.println(<span class="string">&quot;list1: &quot;</span> + list1); <span class="comment">// 输出 list1: [Apple, Banana, Cherry]</span></span><br></pre></td></tr></table></figure><h2 id="复制List的方法"><a href="#复制List的方法" class="headerlink" title="复制List的方法"></a>复制List的方法</h2><p>为了避免上述问题，我们需要创建一个<code>list2</code>的副本，使得对<code>list2</code>的修改不会影响<code>list1</code>。下面是几种复制List的方法，包括实例代码和简要说明：</p><h3 id="1-使用循环遍历"><a href="#1-使用循环遍历" class="headerlink" title="1. 使用循环遍历"></a>1. 使用循环遍历</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">List&lt;String&gt; list1 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(Arrays.asList(<span class="string">&quot;Apple&quot;</span>, <span class="string">&quot;Banana&quot;</span>));</span><br><span class="line">List&lt;String&gt; list2 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line"><span class="keyword">for</span> (String item : list1) &#123;</span><br><span class="line">    list2.add(item);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这种方法通过遍历原始列表，并手动将每个元素添加到新列表中。新列表是一个独立的副本。</p><h3 id="2-使用List构造方法"><a href="#2-使用List构造方法" class="headerlink" title="2. 使用List构造方法"></a>2. 使用List构造方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">List&lt;String&gt; list1 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(Arrays.asList(<span class="string">&quot;Apple&quot;</span>, <span class="string">&quot;Banana&quot;</span>));</span><br><span class="line">List&lt;String&gt; list2 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(list1);</span><br></pre></td></tr></table></figure><p>这种方法通过<code>ArrayList</code>的构造函数创建一个新的列表，并将原始列表的所有元素添加到新列表中。新列表是一个独立的副本。</p><h3 id="3-使用addAll-方法"><a href="#3-使用addAll-方法" class="headerlink" title="3. 使用addAll()方法"></a>3. 使用<code>addAll()</code>方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">List&lt;String&gt; list1 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(Arrays.asList(<span class="string">&quot;Apple&quot;</span>, <span class="string">&quot;Banana&quot;</span>));</span><br><span class="line">List&lt;String&gt; list2 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">list2.addAll(list1);</span><br></pre></td></tr></table></figure><p>这种方法使用<code>addAll()</code>方法将原始列表的所有元素添加到新列表中。新列表是一个独立的副本。</p><h3 id="4-使用Collections-copy-方法"><a href="#4-使用Collections-copy-方法" class="headerlink" title="4. 使用Collections.copy()方法"></a>4. 使用<code>Collections.copy()</code>方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">List&lt;String&gt; list1 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(Arrays.asList(<span class="string">&quot;Apple&quot;</span>, <span class="string">&quot;Banana&quot;</span>));</span><br><span class="line">List&lt;String&gt; list2 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(list1.size());</span><br><span class="line">Collections.copy(list2, list1);</span><br></pre></td></tr></table></figure><p>这种方法使用<code>Collections.copy()</code>方法将原始列表的所有元素复制到新列表中。新列表是一个独立的副本。</p><h3 id="5-使用Java-8-Stream-API"><a href="#5-使用Java-8-Stream-API" class="headerlink" title="5. 使用Java 8 Stream API"></a>5. 使用Java 8 Stream API</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">List&lt;String&gt; list1 = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(Arrays.asList(<span class="string">&quot;Apple&quot;</span>, <span class="string">&quot;Banana&quot;</span>));</span><br><span class="line">List&lt;String&gt; list2 = list1.stream().collect(Collectors.toList());</span><br></pre></td></tr></table></figure><p>这种方法使用<code>Stream</code> API来创建一个包含原始列表所有元素的新列表。新列表是一个独立的副本。</p><h3 id="6-使用JDK-10的copyOf-方法"><a href="#6-使用JDK-10的copyOf-方法" class="headerlink" title="6. 使用JDK 10的copyOf()方法"></a>6. 使用JDK 10的<code>copyOf()</code>方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">List&lt;String&gt; list1 = List.of(<span class="string">&quot;Apple&quot;</span>, <span class="string">&quot;Banana&quot;</span>);</span><br><span class="line">List&lt;String&gt; list2 = List.copyOf(list1);</span><br></pre></td></tr></table></figure><p>这种方法利用JDK 10引入的<code>copyOf()</code>方法来创建一个不可变的列表副本。</p><h2 id="浅拷贝-vs-深拷贝"><a href="#浅拷贝-vs-深拷贝" class="headerlink" title="浅拷贝 vs 深拷贝"></a>浅拷贝 vs 深拷贝</h2><p>在复制包含对象引用的列表时，重要的是要理解浅拷贝和深拷贝的区别：</p><ul><li><p><strong>浅拷贝</strong>：复制的是对象引用本身，而不是对象本身。这意味着，如果原始列表中的对象被修改，这些修改将反映在副本列表中，因为它们引用的是同一个对象。</p></li><li><p><strong>深拷贝</strong>：复制的是对象本身，创建一个完全独立的副本。对原始对象或副本对象的修改不会影响另一个对象。<br>在实际应用中，选择浅拷贝还是深拷贝取决于具体的需求。如果需要完全独立的副本，那么应该选择深拷贝。如果只是需要一个相同元素的列表，而不关心原始对象的修改，那么浅拷贝就足够了。<br>希望这些方法和实例能够帮助你更好地理解在Java中复制List的不同方式。</p></li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;Java中的List对象复制：深入解析与实例演示&quot;&gt;&lt;a href=&quot;#Java中的List对象复制：深入解析与实例演示&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="Java" scheme="https://blog.natuie.net/categories/Java/"/>
    
    
    <category term="问题" scheme="https://blog.natuie.net/tags/%E9%97%AE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>Spring整合Redis出现乱码问题</title>
    <link href="https://blog.natuie.net/posts/2024/06/06/124825/"/>
    <id>https://blog.natuie.net/posts/2024/06/06/124825/</id>
    <published>2024-06-06T04:48:25.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><p>我们从服务器上看到对应的keys，是这样的</p><figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">127.0.0.1:6379</span>&gt; keys *</span><br><span class="line"><span class="number">1</span>) <span class="string">&quot;\xac\xed\x00\x05t\x00\x04name&quot;</span></span><br></pre></td></tr></table></figure><h2 id="解决乱码问题"><a href="#解决乱码问题" class="headerlink" title="解决乱码问题"></a>解决乱码问题</h2><p>在Spring Boot中集成Redis的乱码问题，通常来说应该是编码问题。</p><h3 id="配置RedisTemplate"><a href="#配置RedisTemplate" class="headerlink" title="配置RedisTemplate"></a>配置RedisTemplate</h3><p>Spring Boot会自动配置<code>RedisTemplate</code>，但默认情况下，它使用的是JDK的序列化机制，这可能会导致乱码问题。为了防止乱码，你可以自定义<code>RedisTemplate</code>的配置，使用<code>StringRedisTemplate</code>，它默认使用<code>StringRedisSerializer</code>，可以避免乱码问题。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RedisConfig</span> &#123;</span><br><span class="line">    <span class="meta">@Bean(&quot;redisTemplate&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> RedisTemplate&lt;String, Object&gt; <span class="title function_">redisTemplate</span><span class="params">(RedisConnectionFactory factory)</span> &#123;</span><br><span class="line">        RedisTemplate&lt;String, Object&gt; template = <span class="keyword">new</span> <span class="title class_">RedisTemplate</span>&lt;&gt;();</span><br><span class="line">        template.setConnectionFactory(factory);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">//Json序列化配置</span></span><br><span class="line">        Jackson2JsonRedisSerializer&lt;Object&gt; Jackson2JsonRedisSerializer = <span class="keyword">new</span> <span class="title class_">Jackson2JsonRedisSerializer</span>&lt;&gt;(Object.class);</span><br><span class="line">        <span class="type">ObjectMapper</span> <span class="variable">mp</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectMapper</span>();</span><br><span class="line">        mp.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);</span><br><span class="line">        mp.activateDefaultTyping(mp.getPolymorphicTypeValidator());</span><br><span class="line">        Jackson2JsonRedisSerializer.serialize(mp);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//Spring的序列化</span></span><br><span class="line">        <span class="type">StringRedisSerializer</span> <span class="variable">stringRedisSerializer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringRedisSerializer</span>();</span><br><span class="line">        <span class="comment">//key采用String的序列化方式</span></span><br><span class="line">        template.setKeySerializer(stringRedisSerializer);</span><br><span class="line">        <span class="comment">//hash的key也采用string的序列化方式</span></span><br><span class="line">        template.setHashKeySerializer(stringRedisSerializer);</span><br><span class="line">        <span class="comment">//valye的序列化方式采用的是jackson</span></span><br><span class="line">        template.setValueSerializer(Jackson2JsonRedisSerializer);</span><br><span class="line">        <span class="comment">//hash的value序列化方式采用jackson</span></span><br><span class="line">        template.setHashValueSerializer(Jackson2JsonRedisSerializer);</span><br><span class="line">        <span class="comment">// 设置其他的k-v的默认的序列化</span></span><br><span class="line">        template.setDefaultSerializer(Jackson2JsonRedisSerializer);</span><br><span class="line">        template.afterPropertiesSet();</span><br><span class="line">        <span class="keyword">return</span> template;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="使用RedisTemplate"><a href="#使用RedisTemplate" class="headerlink" title="使用RedisTemplate"></a>使用RedisTemplate</h3><p>在你的服务中注入<code>RedisTemplate</code>并使用它：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RedisService</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Resource</span></span><br><span class="line">    <span class="keyword">private</span> RedisTemplate redisTemplate;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">set</span><span class="params">(String key, String value)</span> &#123;</span><br><span class="line">        redisTemplate.opsForValue().set(key, value);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">get</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> (String) redisTemplate.opsForValue().get(key);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="仍然遇到乱码问题"><a href="#仍然遇到乱码问题" class="headerlink" title="仍然遇到乱码问题"></a>仍然遇到乱码问题</h3><p>如果你在使用<code>RedisTemplate</code>时仍然遇到乱码问题，可能是因为Redis服务器的默认编码不是UTF-8。你可以通过修改Redis配置文件（通常是<code>redis.conf</code>）来设置默认编码为UTF-8：</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># redis.conf</span></span><br><span class="line"><span class="attribute">appendonly</span> yes</span><br><span class="line"><span class="attribute">appendfsync</span> everysec</span><br><span class="line"><span class="comment"># 设置Redis的默认编码为UTF-8</span></span><br><span class="line"><span class="attribute">client</span>-output-buffer-limit normal <span class="number">0</span> <span class="number">0</span> <span class="number">0</span></span><br><span class="line"><span class="attribute">client</span>-output-buffer-limit slave <span class="number">256</span>mb <span class="number">64</span>mb <span class="number">60</span></span><br><span class="line"><span class="attribute">client</span>-output-buffer-limit pubsub <span class="number">32</span>mb <span class="number">8</span>mb <span class="number">60</span></span><br></pre></td></tr></table></figure><h3 id="redis-cli-中文出现乱码问题解决"><a href="#redis-cli-中文出现乱码问题解决" class="headerlink" title="redis-cli 中文出现乱码问题解决"></a>redis-cli 中文出现乱码问题解决</h3><p>  redis会将存储的中文数据转成16进制，所以我们在连接控制台的时候将redis-cli改为redis-cli –raw输入进去即可</p><p>重启Redis服务后，乱码问题应该会得到解决。</p><p>以上步骤应该能帮助你在Spring Boot中集成Redis并解决乱码问题。如果问题依旧存在，可能需要检查Redis服务器的配置或网络传输过程中的编码问题。</p>]]></content>
    
    
    <summary type="html">Spring整合Redis遇到&#92;xac&#92;xed&#92;x00&#92;x05t&#92;x00&#92;x04乱码问题的解决方案以及redis-cli中文乱码解决方案</summary>
    
    
    
    <category term="Redis" scheme="https://blog.natuie.net/categories/Redis/"/>
    
    
    <category term="问题" scheme="https://blog.natuie.net/tags/%E9%97%AE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>Android的DSU Loader动态系统更新不显示问题</title>
    <link href="https://blog.natuie.net/posts/2024/06/06/120912/"/>
    <id>https://blog.natuie.net/posts/2024/06/06/120912/</id>
    <published>2024-06-06T04:09:12.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<h2 id="我使用的系统"><a href="#我使用的系统" class="headerlink" title="我使用的系统"></a>我使用的系统</h2><p>HyperOS 1.0.8.0.UMNCNXM</p><h2 id="使用-DSU-尝鲜新系统"><a href="#使用-DSU-尝鲜新系统" class="headerlink" title="使用 DSU 尝鲜新系统"></a>使用 DSU 尝鲜新系统</h2><p>DSU 是动态系统更新（Dynamic System Updates）的缩写，是一项在 Android 10 及以上版本中引入的功能，可以让用户在不重启设备的情况下更新系统镜像。</p><h3 id="必备条件"><a href="#必备条件" class="headerlink" title="必备条件"></a>必备条件</h3><p>一台 Android 10+ 的安卓设备<br>支持动态分区 &#x2F; 支持 GSI<br>对于设备有一定的了解<br>如果你不确定自己的设备是否支持动态分区特性，建议先下载安装 Treble Check 这个应用打开看看。</p><h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>在Android 10+设备上，开发者选项里面没有找到DSU Loader这个选项，也没有找到DSU这个选项，也有可能由于HyperOS的缘故，由于没有解锁bl获取最高权限，通常来说是不需要的。</p><h2 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h2><p>对于这个问题，我手机是解了bl锁的嘛，刷了ksu或者magisk，刷了一些模块，刚开始啥也没干是可以找到这个选项的，也可以正常使用。</p><p>多种尝试，终于解决了这个问题。</p><p><img src="/img/post/1717646711311.jpg" alt="DSU选项"></p><p>多种尝试后，原来是刷了一些隐藏模块导致的问题，具体受影响的模块为：</p><p><img src="/img/post/1717647052627.jpg" alt="Shamiko模块"></p><p><img src="/img/post/1717647060217.jpg" alt="隐藏BL锁模块"></p><p>禁用这2个模块重启手机即可，如果还是没用可以尝试禁用关于隐藏的agisk模块&#x2F;XP模块，还是不行，全部禁用一个一个找原因。</p><p>如果你的手机没刷机，也没显示，可能是厂商阉割掉了。注意该特性只对于Android10+以上才有的，低于不显示很正常，不支持嘛。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;我使用的系统&quot;&gt;&lt;a href=&quot;#我使用的系统&quot; class=&quot;headerlink&quot; title=&quot;我使用的系统&quot;&gt;&lt;/a&gt;我使用的系统&lt;/h2&gt;&lt;p&gt;HyperOS 1.0.8.0.UMNCNXM&lt;/p&gt;
&lt;h2 id=&quot;使用-DSU-尝鲜新系统&quot;&gt;&lt;a</summary>
        
      
    
    
    
    <category term="Android" scheme="https://blog.natuie.net/categories/Android/"/>
    
    
    <category term="问题" scheme="https://blog.natuie.net/tags/%E9%97%AE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>RealSR-NCNN-Android：图片放大工具</title>
    <link href="https://blog.natuie.net/posts/2024/02/07/153642/"/>
    <id>https://blog.natuie.net/posts/2024/02/07/153642/</id>
    <published>2024-02-07T07:36:42.000Z</published>
    <updated>2025-08-16T15:24:59.574Z</updated>
    
    <content type="html"><![CDATA[<h3 id="RealSR-NCNN-Android"><a href="#RealSR-NCNN-Android" class="headerlink" title="RealSR-NCNN-Android"></a>RealSR-NCNN-Android</h3><p>RealSR-NCNN-Android 是一个简单的 Android 应用程序，它基于 Waifu2x-NCNN、SRMD-NCNN、RealCUGAN-NCNN、RealSR-NCNN 和 Real-ESRGAN、Anime4KCPP。</p><p>超分辨率是指将低质量压缩图片恢复成高分辨率图片的过程，用更常见的讲法就是放大图片并降噪。<br>随着移动互联网的快速发展，智能设备逐渐普及到生活的每个角落。随之而来的是大量的图像数据。有的图片本身分辨率就比较低，难以看清楚细节；有的在存储和传输的过程中被反复压缩和劣化，最终不再清晰。<br>为了获得更加高质量的视觉体验，或者出于更为基本的目的看清楚图片，图像恢复&#x2F;超分辨率算法应运而生。而手机作为目前我们生活中最常使用的智能设备，显然有使用这一技术的迫切需求。</p><p>这个项目正是为安卓设备构建的一个图像超分辨率的应用。具有如下特点：</p><ol><li>内置超分算法和模型多。最初使用了RealSR-NCNN和Real-ESRGAN的成果，后来又添加了SRMD-NCNN和RealCUGAN-NCNN, Anime4KCPP。同时也内置了waifu2x-ncnn（但是没有内置模型和预设命令，如有需求自行下载并添加）</li><li>兼顾传统插值算法。包括常见的nearest、bilinear、bicubic算法，以及imagemagick的二十多种filter。</li><li>内置缩小算法。除使用用户指定倍率和算法的缩小方式外，resize-ncnn设计了一种自动缩小的算法de-nearest。参见笔记</li><li>支持图形界面和命令行两种操作方式使用。</li><li>转换结果先预览，满意再导出，不浪费存储空间。</li><li>导出文件自动按照模型和时间命名，方便管理。</li><li>自定义优先选用的超分算法和模型。</li><li>自定义预设命令。</li><li>图片处理过程完全在本地运行，无需担心隐私泄漏、服务器排队、服务收费；处理耗时取于决选择的模型、图片大小以及设备的性能。</li></ol><h3 id="项目地址"><a href="#项目地址" class="headerlink" title="项目地址"></a>项目地址</h3><p><a href="https://github.com/tumuyan/RealSR-NCNN-Android">https://github.com/tumuyan/RealSR-NCNN-Android</a><br>该项目由tumuyan提供，并非我!</p><h3 id="如何使用RealSR-NCNN-Android-GUI"><a href="#如何使用RealSR-NCNN-Android-GUI" class="headerlink" title="如何使用RealSR-NCNN-Android-GUI"></a>如何使用RealSR-NCNN-Android-GUI</h3><h4 id="选择文件的两种方法："><a href="#选择文件的两种方法：" class="headerlink" title="选择文件的两种方法："></a>选择文件的两种方法：</h4><ol><li>将其他应用（例如图库）中的一张或多张图片共享到此应用</li><li>在本应用中，点击选图选择图片</li></ol><h4 id="支持两种操作方式"><a href="#支持两种操作方式" class="headerlink" title="支持两种操作方式:"></a>支持两种操作方式:</h4><ol><li>点击放大（视图片大小和设备性能需要等待不同时间——毕竟原项目是使用电脑显卡运行的）- 查看放大效果是否满意，如果满意点击导出保存到相册。也可以在运行前切换使用的模型。切换模型后无需重新选择图片。运行过程中点击右上角进度可以终止运行；运行过程中切换模型并点击运行，或者直接输入命令并回车，可以终止上次任务并开始执行新的任务。</li><li>直接在输入框内输入命令完成调用(可以输入help查看更多信息)</li></ol><p>应用依赖于vulkan API，所以对设备有如下要求：<br>使用了比较新的SOC。经过实际测试，骁龙853（GPU Adreno510）可以处理较小的图片<br>系统支持vulkan。（Google在Android7.0中增加了vulkan的集成，但是您的设备厂商不一定提供了这项支持）</p><h3 id="图片放大算法说明"><a href="#图片放大算法说明" class="headerlink" title="图片放大算法说明"></a>图片放大算法说明</h3><p><a href="https://note.youdao.com/s/6XlIFbWt">https://note.youdao.com/s/6XlIFbWt</a></p><h3 id="向-RealSR-NCNN-Android-GUI-添加更多模型"><a href="#向-RealSR-NCNN-Android-GUI-添加更多模型" class="headerlink" title="向 RealSR-NCNN-Android-GUI 添加更多模型"></a>向 RealSR-NCNN-Android-GUI 添加更多模型</h3><p>RealSR-NCNN-Android-GUI 在 ver 1.7.6 以上的版本可以自动加载自定义模型。 你可以从 <a href="https://github.com/tumuyan/realsr-models">https://github.com/tumuyan/realsr-models</a> 下载更多模型：</p><ol><li>在文件管理器里新建一个目录</li><li>在App的设置中，自定义模型路径的选项里填入刚才新建目录的路径，点击保存</li><li>下载模型并复制到刚才新建的目录里</li><li>返回App，可以看到下拉菜单增加了新的模型</li></ol><p>你自己也可以把pth格式的模型转换为本应用可用的ncnn模型。</p><p>从 <a href="https://upscale.wiki/wiki/Model_Database">https://upscale.wiki/wiki/Model_Database</a> 下载模型并解压，下载 <a href="https://github.com/n00mkrad/cupscale">cupscale</a> 并解压，打开 CupscaleData\bin\pth2ncnn, 用 pth2ncnn.exe 转换 pth 文件为 ncnn 模型文件<br>重命名文件，举例：</p><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">models</span>-Real-ESRGAN-AnimeSharp  <span class="comment">// 目录需要用 models-Real- 或 models-ESRGAN- 开头</span></span><br><span class="line">├─<span class="built_in">x4</span>.bin                       <span class="comment">// 模型名称为 x[n], n 是放大倍率</span></span><br><span class="line">├─<span class="built_in">x4</span>.param</span><br></pre></td></tr></table></figure><h3 id="如何使用-RealSR-NCNN-Android-CLI"><a href="#如何使用-RealSR-NCNN-Android-CLI" class="headerlink" title="如何使用 RealSR-NCNN-Android-CLI"></a>如何使用 RealSR-NCNN-Android-CLI</h3><h4 id="下载模型"><a href="#下载模型" class="headerlink" title="下载模型"></a>下载模型</h4><p>你可以从 github release 页面下载 assets.zip, 或者从 <a href="https://github.com/tumuyan/realsr-models">https://github.com/tumuyan/realsr-models</a> 下载所需模型，需要注意不同程序需要用对应的模型</p><h4 id="示例命令"><a href="#示例命令" class="headerlink" title="示例命令"></a>示例命令</h4><p>确保 elf 文件具有执行权限。然后输入命令</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./realsr-ncnn -<span class="selector-tag">i</span> <span class="selector-tag">input</span><span class="selector-class">.jpg</span> -o output.jpg</span><br></pre></td></tr></table></figure><h4 id="完整用法"><a href="#完整用法" class="headerlink" title="完整用法"></a>完整用法</h4><p>其他程序的用法与realsr-ncnn相同。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">用法: realsr-ncnn -i 输入的图片路径 -o 输出的图片路径 [其他可选参数]...</span><br><span class="line"></span><br><span class="line">  -h                   显示帮助</span><br><span class="line">  -v                   显示更多输出内容</span><br><span class="line">  -i input-path        输入的图片路径（jpg/png/webp路径或者目录路径）</span><br><span class="line">  -o output-path       输出的图片路径（jpg/png/webp路径或者目录路径）</span><br><span class="line">  -s scale             缩放系数(默认4，即放大4倍)</span><br><span class="line">  -t tile-size         tile size (&gt;=32/0=auto, default=0) can be 0,0,0 for multi-gpu</span><br><span class="line">  -m model-path        模型路径 (默认模型 models-Real-ESRGAN-anime)</span><br><span class="line">  -g gpu-id            gpu，-1使用CPU，默认0 多GPU可选 0,1,2</span><br><span class="line">  -j load:proc:save    解码/处理/保存的线程数 (默认1:2:2) 多GPU可以设 1:2,2,2:2</span><br><span class="line">  -x                   开启tta模式</span><br><span class="line">  -f format            输出格式(jpg/png/webp, 默认ext/png)</span><br><span class="line">  </span><br></pre></td></tr></table></figure><h3 id="使用报错"><a href="#使用报错" class="headerlink" title="使用报错"></a>使用报错</h3><h4 id="vkQueueSubmit-failed-4"><a href="#vkQueueSubmit-failed-4" class="headerlink" title="vkQueueSubmit failed -4"></a>vkQueueSubmit failed -4</h4><p>  使用real-esrgan-x4模型通常会报错，这是参数没有设置的原因。打开软件设置，设置Tile Size参数，最小值为32。</p><h3 id="使用实践"><a href="#使用实践" class="headerlink" title="使用实践"></a>使用实践</h3><p>这是一张很小较模糊的图片，现在我们让它变大变清晰。<br><img src="/img/post/realsr-practice-1.png" alt="原图"><br>使用软件，我们可以得到这张图。<br><img src="/img/post/realsr-practice-2.png" alt="生成结果"><br>第一张图与这张图形成了明显的对比，图片变大的同时也清晰了不少，这是这个软件的强大之处。</p><h3 id="如何获取？"><a href="#如何获取？" class="headerlink" title="如何获取？"></a>如何获取？</h3><p>这里提供<a href="https://www.123pan.com/s/3VftVv-dGo7d.html">网盘</a>，但是不保证一直是最新版本，可前往上面的开源地址。</p>]]></content>
    
    
    <summary type="html">RealSR-NCNN-Android是一个简单的Android应用程序，它基于 Waifu2x-NCNN、SRMD-NCNN、RealCUGAN-NCNN、RealSR-NCNN 和 Real-ESRGAN、Anime4KCPP。</summary>
    
    
    
    <category term="工具" scheme="https://blog.natuie.net/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="RealSR" scheme="https://blog.natuie.net/tags/RealSR/"/>
    
    <category term="图片处理" scheme="https://blog.natuie.net/tags/%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86/"/>
    
    <category term="Android" scheme="https://blog.natuie.net/tags/Android/"/>
    
  </entry>
  
  <entry>
    <title>Nginx安装与配置</title>
    <link href="https://blog.natuie.net/posts/2024/02/04/211231/"/>
    <id>https://blog.natuie.net/posts/2024/02/04/211231/</id>
    <published>2024-02-04T13:12:31.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Nginx"><a href="#Nginx" class="headerlink" title="Nginx"></a>Nginx</h3><p>Nginx 是一款轻量级、高性能的 HTTP 和反向代理服务器，同时也提供了 IMAP&#x2F;POP3&#x2F;SMTP 服务。它是由俄罗斯的程序员 Igor Sysoev 为了满足俄罗斯访问量极大的 Rambler.ru 站点的高负载需求而开发的。</p><h3 id="安装-Nginx"><a href="#安装-Nginx" class="headerlink" title="安装 Nginx"></a>安装 Nginx</h3><p>在 Linux 系统中，您可以使用包管理器来安装 Nginx。以下是在基于 Debian 的系统（如 Ubuntu）上安装 Nginx 的命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get install nginx</span><br></pre></td></tr></table></figure><p>在基于 Red Hat 的系统（如 CentOS）上安装 Nginx 的命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install nginx</span><br></pre></td></tr></table></figure><p>安装完成后，您可以通过运行以下命令来启动 Nginx 服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl start nginx</span><br></pre></td></tr></table></figure><p>要使 Nginx 服务在系统启动时自动运行，您可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> nginx</span><br></pre></td></tr></table></figure><p>了解您的需求，让我们深入探讨 Nginx 的使用和配置。以下是一个更详细的指南：</p><h3 id="配置-Nginx"><a href="#配置-Nginx" class="headerlink" title="配置 Nginx"></a>配置 Nginx</h3><p>Nginx 的主配置文件通常位于 <code>/etc/nginx/nginx.conf</code>，而站点特定的配置文件通常位于 <code>/etc/nginx/sites-available/</code> 目录下。</p><h4 id="配置文件结构"><a href="#配置文件结构" class="headerlink" title="配置文件结构"></a>配置文件结构</h4><p>Nginx 配置文件由多个部分组成，包括全局设置、事件模块、HTTP 设置、server 块等。</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 全局设置</span></span><br><span class="line"><span class="section">events</span> &#123;</span><br><span class="line">    <span class="attribute">worker_connections</span>  <span class="number">1024</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="section">http</span> &#123;</span><br><span class="line">    <span class="comment"># 文件扩展名与文件类型映射表</span></span><br><span class="line">    <span class="attribute">include</span> mime.types;</span><br><span class="line">    <span class="attribute">default_type</span> application/octet-stream;</span><br><span class="line">    <span class="comment"># 开启目录列表访问，适合开发环境</span></span><br><span class="line">    <span class="attribute">autoindex</span> <span class="literal">on</span>;</span><br><span class="line">    <span class="comment"># 设置日志</span></span><br><span class="line">    <span class="attribute">log_format</span> main <span class="string">&#x27;<span class="variable">$remote_addr</span> - <span class="variable">$remote_user</span> [<span class="variable">$time_local</span>] &quot;<span class="variable">$request</span>&quot; &#x27;</span></span><br><span class="line">                  <span class="string">&#x27;<span class="variable">$status</span> <span class="variable">$body_bytes_sent</span> &quot;<span class="variable">$http_referer</span>&quot; &#x27;</span></span><br><span class="line">                  <span class="string">&#x27;&quot;<span class="variable">$http_user_agent</span>&quot; &quot;<span class="variable">$http_x_forwarded_for</span>&quot;&#x27;</span>;</span><br><span class="line">    <span class="attribute">access_log</span> /var/log/nginx/access.log main;</span><br><span class="line">    <span class="attribute">error_log</span> /var/log/nginx/<span class="literal">error</span>.log <span class="literal">notice</span>;</span><br><span class="line">    <span class="comment"># 配置服务器</span></span><br><span class="line">    <span class="section">server</span> &#123;</span><br><span class="line">        <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">        <span class="attribute">server_name</span> example.com;</span><br><span class="line">        <span class="comment"># 位置（path）设置</span></span><br><span class="line">        <span class="section">location</span> / &#123;</span><br><span class="line">            <span class="attribute">root</span> /usr/share/nginx/html;</span><br><span class="line">            <span class="attribute">index</span> index.html index.htm;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment"># 错误页面</span></span><br><span class="line">        <span class="attribute">error_page</span> <span class="number">404</span> /<span class="number">404</span>.html;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="配置一个简单的网站"><a href="#配置一个简单的网站" class="headerlink" title="配置一个简单的网站"></a>配置一个简单的网站</h4><p>要配置一个简单的网站，您需要创建一个 <code>server</code> 块，并指定 <code>listen</code> 指令来监听端口，<code>server_name</code> 指令来指定域名，以及 <code>location</code> 指令来配置网站的路径和文件。</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> example.com;</span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">root</span> /var/www/example.com;</span><br><span class="line">        <span class="attribute">index</span> index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="配置虚拟主机"><a href="#配置虚拟主机" class="headerlink" title="配置虚拟主机"></a>配置虚拟主机</h4><p>要为多个域名配置同一个服务器，您可以使用多个 <code>server</code> 块，并为每个域名指定不同的 <code>server_name</code>。</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> example.com;</span><br><span class="line">    <span class="comment"># ...</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> www.example.com;</span><br><span class="line">    <span class="comment"># ...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="配置静态文件服务"><a href="#配置静态文件服务" class="headerlink" title="配置静态文件服务"></a>配置静态文件服务</h4><p>如果您想要配置 Nginx 来服务静态文件，您可以使用 <code>root</code> 指令来指定文件路径。</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> example.com;</span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">root</span> /var/www/example.com;</span><br><span class="line">        <span class="attribute">index</span> index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="配置反向代理"><a href="#配置反向代理" class="headerlink" title="配置反向代理"></a>配置反向代理</h4><p>Nginx 也可以用作反向代理服务器。以下是一个配置反向代理的例子：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> example.com;</span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://backend;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Host <span class="variable">$host</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在这个配置中，<code>proxy_pass</code> 指令指定了后端服务器的地址。<code>proxy_set_header</code> 指令用于设置发送到后端服务器的 HTTP 头信息，包括原始请求的 <code>Host</code>、<code>X-Real-IP</code>（客户端的真实 IP）、<code>X-Forwarded-For</code>（客户端的原始 IP）和 <code>X-Forwarded-Proto</code>（原始请求的协议）。</p><h4 id="配置-SSL-TLS"><a href="#配置-SSL-TLS" class="headerlink" title="配置 SSL&#x2F;TLS"></a>配置 SSL&#x2F;TLS</h4><p>为了安全地传输数据，您应该为您的网站配置 SSL&#x2F;TLS。您可以使用 Let’s Encrypt 提供的免费证书。以下是如何为 Nginx 配置 SSL 的基本步骤：</p><ol><li><p>申请证书，可使用<code>acme.sh</code>工具来申请证书，也可以通过网站来申请证书。</p></li><li><p>创建一个 SSL 配置文件：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl;</span><br><span class="line">    <span class="attribute">server_name</span> example.com www.example.com;</span><br><span class="line">    <span class="attribute">ssl_certificate</span> /etc/ssl/certs/example.com.crt;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /etc/ssl/private/example.com.key;</span><br><span class="line">    <span class="attribute">ssl_protocols</span> TLSv1.<span class="number">2</span> TLSv1.<span class="number">3</span>;</span><br><span class="line">    <span class="attribute">ssl_ciphers</span> <span class="string">&#x27;ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384&#x27;</span>;</span><br><span class="line">    <span class="attribute">ssl_prefer_server_ciphers</span> <span class="literal">on</span>;</span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">root</span> /var/www/example.com;</span><br><span class="line">        <span class="attribute">index</span> index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h4 id="配置-HTTP-2"><a href="#配置-HTTP-2" class="headerlink" title="配置 HTTP&#x2F;2"></a>配置 HTTP&#x2F;2</h4><p>HTTP&#x2F;2 是 HTTP 的一个新版本，它提供了更高的性能和更好的错误检测。要为 Nginx 配置 HTTP&#x2F;2，您需要确保您的服务器支持 HTTP&#x2F;2，并且客户端也支持 HTTP&#x2F;2。<br>以下是如何为 Nginx 配置 HTTP&#x2F;2 的基本步骤：</p><ol><li>确保您的操作系统支持 HTTP&#x2F;2。</li><li>确保您的 Nginx 版本支持 HTTP&#x2F;2。</li><li>打开 <code>nginx.conf</code> 文件，并添加以下内容：<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">http</span> &#123;</span><br><span class="line">    <span class="comment"># ...</span></span><br><span class="line">    <span class="section">server</span> &#123;</span><br><span class="line">        <span class="attribute">listen</span> <span class="number">443</span> ssl http2;</span><br><span class="line">        <span class="attribute">server_name</span> example.com;</span><br><span class="line">        <span class="attribute">ssl_certificate</span> /etc/ssl/certs/example.com.crt;</span><br><span class="line">        <span class="attribute">ssl_certificate_key</span> /etc/ssl/private/example.com.key;</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># ... (其他 SSL 配置)</span></span><br><span class="line">        <span class="section">location</span> / &#123;</span><br><span class="line">            <span class="comment"># ...</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h4 id="配置-HTTPS-重定向"><a href="#配置-HTTPS-重定向" class="headerlink" title="配置 HTTPS 重定向"></a>配置 HTTPS 重定向</h4><p>为了确保所有流量都通过 HTTPS 传输，您应该将所有 HTTP 请求重定向到 HTTPS。您可以在 <code>server</code> 块中使用 <code>return</code> 指令来实现。</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> example.com;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> https://<span class="variable">$host</span><span class="variable">$request_uri</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="配置高可用性和负载均衡"><a href="#配置高可用性和负载均衡" class="headerlink" title="配置高可用性和负载均衡"></a>配置高可用性和负载均衡</h4><p>为了提高网站的可靠性，您可以配置 Nginx 作为高可用性和负载均衡服务器。这通常涉及到设置多个 Nginx 实例和一个或多个后端服务器。<br>以下是一个简单的负载均衡配置示例：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">http</span> &#123;</span><br><span class="line">    <span class="section">upstream</span> backend &#123;</span><br><span class="line">        <span class="attribute">server</span> backend1.example.com;</span><br><span class="line">        <span class="attribute">server</span> backend2.example.com;</span><br><span class="line">        <span class="attribute">server</span> backend3.example.com;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="section">server</span> &#123;</span><br><span class="line">        <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">        <span class="attribute">server_name</span> example.com;</span><br><span class="line">        <span class="section">location</span> / &#123;</span><br><span class="line">            <span class="attribute">proxy_pass</span> http://backend;</span><br><span class="line">            <span class="attribute">proxy_set_header</span> Host <span class="variable">$host</span>;</span><br><span class="line">            <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">            <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">            <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在这个配置中，<code>upstream</code> 指令定义了一个后端服务器的集合，<code>proxy_pass</code> 指令将请求转发到这个集合中的任意一个服务器。</p><h4 id="配置缓存"><a href="#配置缓存" class="headerlink" title="配置缓存"></a>配置缓存</h4><p>Nginx 支持在服务器端缓存静态文件，这可以提高网站的性能。以下是一个简单的缓存配置示例：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> example.com;</span><br><span class="line">    <span class="section">location</span> <span class="regexp">~ ^/(images|css|js)/</span> &#123;</span><br><span class="line">        <span class="attribute">root</span> /var/www/example.com;</span><br><span class="line">        <span class="attribute">expires</span> <span class="number">30d</span>;</span><br><span class="line">        <span class="attribute">access_log</span> <span class="literal">off</span>;</span><br><span class="line">        <span class="attribute">add_header</span> Cache-Control <span class="string">&quot;public&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在这个配置中，<code>location</code> 指令用于匹配特定的 URL 模式，<code>root</code> 指令指定了文件路径，<code>expires</code> 指令设置了缓存期限，<code>access_log</code> 指令禁用了访问日志，<code>add_header</code> 指令添加了一个 <code>Cache-Control</code> 头，指示浏览器缓存该内容。</p><h3 id="重启-Nginx"><a href="#重启-Nginx" class="headerlink" title="重启 Nginx"></a>重启 Nginx</h3><p>在修改完配置文件后，您需要重启 Nginx 服务以使更改生效。您可以使用以下命令来重启 Nginx：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart nginx</span><br></pre></td></tr></table></figure><h3 id="故障排除"><a href="#故障排除" class="headerlink" title="故障排除"></a>故障排除</h3><p>如果 Nginx 服务无法启动，您可以检查日志文件 <code>/var/log/nginx/error.log</code> 以获取错误信息。</p>]]></content>
    
    
    <summary type="html">Nginx是一款轻量级、高性能的 HTTP 和反向代理服务器，同时也提供了 IMAP/POP3/SMTP 服务。它是由俄罗斯的程序员 Igor Sysoev 为了满足俄罗斯访问量极大的 Rambler.ru 站点的高负载需求而开发的。</summary>
    
    
    
    <category term="软件" scheme="https://blog.natuie.net/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
    <category term="Web" scheme="https://blog.natuie.net/tags/Web/"/>
    
    <category term="配置" scheme="https://blog.natuie.net/tags/%E9%85%8D%E7%BD%AE/"/>
    
    <category term="Nginx" scheme="https://blog.natuie.net/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>Spring Boot集成JPA</title>
    <link href="https://blog.natuie.net/posts/2024/02/04/191926/"/>
    <id>https://blog.natuie.net/posts/2024/02/04/191926/</id>
    <published>2024-02-04T11:19:26.000Z</published>
    <updated>2025-08-16T15:24:59.575Z</updated>
    
    <content type="html"><![CDATA[<h3 id="什么是-Spring-Data-JPA？"><a href="#什么是-Spring-Data-JPA？" class="headerlink" title="什么是 Spring Data JPA？"></a>什么是 Spring Data JPA？</h3><p>Spring Data JPA 是 Spring Data 项目的一部分，它提供了一种简化的数据访问方式，用于与关系型数据库进行交互。它基于 Java Persistence API（JPA） 标准，并提供了一套简洁的 API 和注解，使开发人员能够通过简单的 Java 对象来表示数据库表，并通过自动生成的 SQL 语句执行常见的 CRUD 操作。Spring Data JPA 通过封装 JPA 的复杂性，简化了数据访问层的开发工作，使开发人员能够更专注于业务逻辑的实现。它还提供了丰富的查询方法的定义、分页和排序支持、事务管理等功能，使开发人员能够更方便地进行数据访问和操作。</p><h3 id="Spring-Data-JPA-的优势"><a href="#Spring-Data-JPA-的优势" class="headerlink" title="Spring Data JPA 的优势"></a>Spring Data JPA 的优势</h3><ul><li><strong>简化数据库操作</strong>：通过提供丰富的接口和抽象，Spring Data JPA 减少了样板代码的编写。</li><li><strong>强大的查询功能</strong>：支持基于方法名的查询、JPQL、SQL 以及 Specifications。</li><li><strong>集成 Spring 生态系统</strong>：与 Spring Boot 无缝集成，提供了事务管理、集成测试等特性。</li><li><strong>灵活性和可扩展性</strong>：允许自定义 Repository 方法，以实现复杂的数据库操作。</li></ul><h3 id="Spring-Boot-中集成-Spring-Data-JPA"><a href="#Spring-Boot-中集成-Spring-Data-JPA" class="headerlink" title="Spring Boot 中集成 Spring Data JPA"></a>Spring Boot 中集成 Spring Data JPA</h3><p>在 Spring Boot 应用程序中集成 Spring Data JPA 非常简单。以下是一些基本步骤：</p><h4 id="步骤-1：添加依赖"><a href="#步骤-1：添加依赖" class="headerlink" title="步骤 1：添加依赖"></a><strong>步骤 1：添加依赖</strong></h4><p>在 <code>pom.xml</code> 文件中添加 Spring Data JPA 和数据库驱动的依赖。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- Spring Data JPA --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-data-jpa<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- 数据库驱动（以 PostgreSQL 数据库为例） --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.postgresql<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>postgresql<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">scope</span>&gt;</span>runtime<span class="tag">&lt;/<span class="name">scope</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="步骤-2：配置数据源"><a href="#步骤-2：配置数据源" class="headerlink" title="步骤 2：配置数据源"></a><strong>步骤 2：配置数据源</strong></h4><p>在 <code>application.yml</code> 文件中配置数据库连接信息。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line">  <span class="attr">datasource:</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">jdbc:postgresql://localhost:5432/test</span> <span class="comment"># test为数据库，可自行替换</span></span><br><span class="line">    <span class="attr">driverClassName:</span> <span class="string">org.postgresql.Driver</span> <span class="comment"># PostgreSQL数据库驱动，如果用其他数据库可自行更改</span></span><br><span class="line">    <span class="attr">username:</span> <span class="string">natuie</span> <span class="comment"># 数据库用户名</span></span><br><span class="line">    <span class="attr">password:</span> <span class="string">***</span> <span class="comment"># 数据库密码</span></span><br><span class="line">  <span class="attr">jpa:</span></span><br><span class="line">    <span class="attr">show-sql:</span> <span class="literal">true</span> <span class="comment"># 在控制台打印执行的SQL语句</span></span><br><span class="line">    <span class="attr">hibernate:</span></span><br><span class="line">      <span class="attr">ddl-auto:</span> <span class="string">update</span> <span class="comment"># 指定为update，每次启动项目因表结构变化就会更新/新增字段，表不存在时会新建，如果指定create，则每次启动项目都会清空数据并删除表，再新建</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="步骤-3：创建实体类"><a href="#步骤-3：创建实体类" class="headerlink" title="步骤 3：创建实体类"></a><strong>步骤 3：创建实体类</strong></h4><p>定义一个实体类，使用 JPA 注解映射到数据库表。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@NoArgsConstructor</span></span><br><span class="line"><span class="meta">@Table(name = &quot;book&quot;)</span> <span class="comment">// 表名</span></span><br><span class="line"><span class="meta">@Entity</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Book</span> &#123;</span><br><span class="line">    <span class="meta">@Id</span> <span class="comment">// 主键</span></span><br><span class="line">    <span class="meta">@GeneratedValue(strategy = GenerationType.IDENTITY)</span> <span class="comment">// 自增</span></span><br><span class="line">    <span class="keyword">private</span> Integer id;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(name = &quot;name&quot;, nullable = false)</span> <span class="comment">// 字段名以及不能为空</span></span><br><span class="line">    <span class="keyword">private</span> String name;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column(name = &quot;author&quot;, nullable = false)</span></span><br><span class="line">    <span class="keyword">private</span> String author;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Book</span><span class="params">(String name, String author)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.name = name;</span><br><span class="line">        <span class="built_in">this</span>.author = author;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="步骤-4：创建-Repository-接口"><a href="#步骤-4：创建-Repository-接口" class="headerlink" title="步骤 4：创建 Repository 接口"></a><strong>步骤 4：创建 Repository 接口</strong></h4><p>创建一个继承 <code>JpaRepository</code> 的接口，用于定义数据访问操作。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">BookRepository</span> <span class="keyword">extends</span> <span class="title class_">JpaRepository</span>&lt;Book, Integer&gt; &#123;</span><br><span class="line">    List&lt;Book&gt; <span class="title function_">findByName</span><span class="params">(String name)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="步骤-5：使用-Repository"><a href="#步骤-5：使用-Repository" class="headerlink" title="步骤 5：使用 Repository"></a><strong>步骤 5：使用 Repository</strong></h4><p>在控制层中注入 <code>BookRepository</code> 并使用它来执行数据库操作。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Demo</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> BookRepository bookRepository;</span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Demo</span><span class="params">(BookRepository bookRepository)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.bookRepository = bookRepository;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@GetMapping(&quot;/demo&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> Book <span class="title function_">demo</span><span class="params">(String name)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> bookRepository.findByName(name);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行项目，请求<code>/demo</code>这个api，可以看到返回了这本书的信息。</p><p><img src="/img/post/spring-jpa-api-test.png" alt="请求接口返回结果"></p><h3 id="JPA基本注解"><a href="#JPA基本注解" class="headerlink" title="JPA基本注解"></a>JPA基本注解</h3><table><thead><tr><th>注解</th><th>解释</th></tr></thead><tbody><tr><td><code>@Entity</code></td><td>声明类为实体。</td></tr><tr><td><code>@Table</code></td><td>声明实体类对应的表名。如果省略，默认表名将与实体类名相同。</td></tr><tr><td><code>@Column</code></td><td>指定实体类属性映射到数据库表的列名。如果省略，默认列名将与属性名相同。</td></tr><tr><td><code>@Id</code></td><td>指定实体类的唯一标识符，通常为主键。</td></tr><tr><td><code>@GeneratedValue</code></td><td>指定主键的生成策略，如自动增长、序列、UUID等。</td></tr><tr><td><code>@Transient</code></td><td>表示该属性并非一个数据库表的字段的映射，ORM框架将忽略该属性。</td></tr><tr><td><code>@ColumnResult</code></td><td>用于指定查询结果中的列名。</td></tr><tr><td><code>@Embedded</code></td><td>用于注释属性，表示该属性的类是嵌入类。</td></tr><tr><td><code>@Embeddable</code></td><td>用于注释Java类，表示该类是嵌入类。</td></tr><tr><td><code>@Basic</code></td><td>指定实体属性的加载方式，如是否懒加载。</td></tr><tr><td><code>@SequenceGenerator</code></td><td>指定序列生成器的策略，用于生成主键。</td></tr><tr><td><code>@TableGenerator</code></td><td>在数据库中生成一张表来管理主键生成策略。</td></tr><tr><td><code>@AccessType</code></td><td>设置访问类型，决定是否通过字段或通过getter&#x2F;setter方法访问实体属性。</td></tr><tr><td><code>@UniqueConstraint</code></td><td>指定实体类属性组合的唯一约束。</td></tr><tr><td><code>@NamedQueries</code></td><td>指定命名查询的列表，用于在JPQL中定义命名查询。</td></tr><tr><td><code>@NamedQuery</code></td><td>指定使用静态名称的查询，通常在接口中使用。</td></tr></tbody></table><h3 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h3><h4 id="插入"><a href="#插入" class="headerlink" title="插入"></a>插入</h4><p>要插入一个新的书籍，您可以使用 <code>save</code> 方法。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bookRepository.save(<span class="keyword">new</span> <span class="title class_">Book</span>(<span class="string">&quot;学习Spring Boot&quot;</span>, <span class="string">&quot;学习者&quot;</span>));</span><br></pre></td></tr></table></figure><h4 id="查询"><a href="#查询" class="headerlink" title="查询"></a>查询</h4><p>在 Spring Data JPA 中，查询关键字映射是通过方法名到查询逻辑的映射。这些映射是基于约定的，也就是说，Spring Data JPA 会根据接口方法的名字来推断要执行的查询。以下是一些常见的查询关键字映射：</p><h5 id="基本查询"><a href="#基本查询" class="headerlink" title="基本查询"></a>基本查询</h5><ul><li><code>findBy&lt;FieldName&gt;</code>: 查找具有指定字段值的实体。</li><li><code>readBy&lt;FieldName&gt;</code>: 类似于 <code>findBy</code>，但通常用于只读操作。</li><li><code>getBy&lt;FieldName&gt;</code>: 类似于 <code>findBy</code>，但通常用于获取单个实体。</li><li><code>queryBy&lt;FieldName&gt;</code>: 类似于 <code>findBy</code>，但提供更灵活的查询构造。</li><li><code>streamBy&lt;FieldName&gt;</code>: 流式地查找具有指定字段值的实体。</li></ul><h5 id="多个字段"><a href="#多个字段" class="headerlink" title="多个字段"></a>多个字段</h5><ul><li><code>findBy&lt;FieldName1&gt;And&lt;FieldName2&gt;</code>: 查找具有指定字段组合值的实体。</li><li><code>readBy&lt;FieldName1&gt;And&lt;FieldName2&gt;</code>: 类似于 <code>findBy</code>，但通常用于只读操作。</li><li><code>getBy&lt;FieldName1&gt;And&lt;FieldName2&gt;</code>: 类似于 <code>findBy</code>，但通常用于获取单个实体。</li><li><code>queryBy&lt;FieldName1&gt;And&lt;FieldName2&gt;</code>: 类似于 <code>findBy</code>，但提供更灵活的查询构造。</li><li><code>streamBy&lt;FieldName1&gt;And&lt;FieldName2&gt;</code>: 流式地查找具有指定字段组合值的实体。</li></ul><h5 id="字段比较"><a href="#字段比较" class="headerlink" title="字段比较"></a>字段比较</h5><ul><li><code>findBy&lt;FieldName&gt;Eq&lt;Value&gt;</code>: 查找字段等于指定值的实体。</li><li><code>readBy&lt;FieldName&gt;Eq&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于只读操作。</li><li><code>getBy&lt;FieldName&gt;Eq&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于获取单个实体。</li><li><code>queryBy&lt;FieldName&gt;Eq&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但提供更灵活的查询构造。</li><li><code>streamBy&lt;FieldName&gt;Eq&lt;Value&gt;</code>: 流式地查找字段等于指定值的实体。</li></ul><h5 id="字段不等"><a href="#字段不等" class="headerlink" title="字段不等"></a>字段不等</h5><ul><li><code>findBy&lt;FieldName&gt;NotEq&lt;Value&gt;</code>: 查找字段不等于指定值的实体。</li><li><code>readBy&lt;FieldName&gt;NotEq&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于只读操作。</li><li><code>getBy&lt;FieldName&gt;NotEq&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于获取单个实体。</li><li><code>queryBy&lt;FieldName&gt;NotEq&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但提供更灵活的查询构造。</li><li><code>streamBy&lt;FieldName&gt;NotEq&lt;Value&gt;</code>: 流式地查找字段不等于指定值的实体。</li></ul><h5 id="字段包含"><a href="#字段包含" class="headerlink" title="字段包含"></a>字段包含</h5><ul><li><code>findBy&lt;FieldName&gt;Containing&lt;Value&gt;</code>: 查找字段包含指定值的实体。</li><li><code>readBy&lt;FieldName&gt;Containing&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于只读操作。</li><li><code>getBy&lt;FieldName&gt;Containing&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于获取单个实体。</li><li><code>queryBy&lt;FieldName&gt;Containing&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但提供更灵活的查询构造。</li><li><code>streamBy&lt;FieldName&gt;Containing&lt;Value&gt;</code>: 流式地查找字段包含指定值的实体。</li></ul><h5 id="字段不包含"><a href="#字段不包含" class="headerlink" title="字段不包含"></a>字段不包含</h5><ul><li><code>findBy&lt;FieldName&gt;NotContaining&lt;Value&gt;</code>: 查找字段不包含指定值的实体。</li><li><code>readBy&lt;FieldName&gt;NotContaining&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于只读操作。</li><li><code>getBy&lt;FieldName&gt;NotContaining&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于获取单个实体。</li><li><code>queryBy&lt;FieldName&gt;NotContaining&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但提供更灵活的查询构造。</li><li><code>streamBy&lt;FieldName&gt;NotContaining&lt;Value&gt;</code>: 流式地查找字段不包含指定值的实体。</li></ul><h5 id="字段开始于"><a href="#字段开始于" class="headerlink" title="字段开始于"></a>字段开始于</h5><ul><li><p><code>findBy&lt;FieldName&gt;StartingWith&lt;Value&gt;</code>: 查找字段以指定值开始的实体。</p></li><li><p><code>readBy&lt;FieldName&gt;StartingWith&lt;Value&gt;</code>: 类似于 <code>findBy</code>，但通常用于只读。</p></li></ul><p>下面给出示例：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">BookRepository</span> <span class="keyword">extends</span> <span class="title class_">JpaRepository</span>&lt;Book,Integer&gt; &#123;</span><br><span class="line"></span><br><span class="line">    Book <span class="title function_">findByName</span><span class="params">(String name)</span>;</span><br><span class="line"></span><br><span class="line">    Book <span class="title function_">findByNameAndAuthor</span><span class="params">(String name, String author)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这个示例中，我们看到，我们只是通过方法名来定义要做什么，并无需手写具体实现方法，这极大的有利于我们快速开发。<code>findByName</code>方法通过name来获取书籍，如果存在同名，需要返回List<Book>，不然会报错。</p><p>下面根据书名来查找书籍，通过调用上面写的<code>findByName</code> 方法来实现。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bookRepository.findByName(name);</span><br></pre></td></tr></table></figure><p>查找所有书籍。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bookRepository.findAll();</span><br></pre></td></tr></table></figure><h4 id="更新"><a href="#更新" class="headerlink" title="更新"></a>更新</h4><p>要更新一个书籍，也使用 <code>save</code> 方法，首先查找书籍再更新。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Book</span> <span class="variable">book</span> <span class="operator">=</span> bookRepository.findByName(name);</span><br><span class="line">book.setName(newName) <span class="comment">// 这样就可以更新掉原来的名字，不存在会自动插入</span></span><br><span class="line">bookRepository.save(book); </span><br></pre></td></tr></table></figure><h4 id="删除"><a href="#删除" class="headerlink" title="删除"></a>删除</h4><p>要删除所有指定名称的书籍，您可以调用 <code>deleteAllByName</code> 方法。删除和查找的方法名命名是一样的，它也具有这样的功能，区别在于它前缀是delete。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bookRepository.deleteAllByName(name);</span><br></pre></td></tr></table></figure><h4 id="分页"><a href="#分页" class="headerlink" title="分页"></a>分页</h4><p>如果您想要获取分页的书籍列表，您可以使用 <code>Pageable</code> 参数。这里的PageRequest.of有2个参数，pageNumber：页数，pageSize：每页多少页。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bookRepository.findAll(PageRequest.of(<span class="number">1</span>, <span class="number">2</span>)).getContent();</span><br></pre></td></tr></table></figure><h4 id="排序"><a href="#排序" class="headerlink" title="排序"></a>排序</h4><h5 id="方法1：-基于特殊参数的排序"><a href="#方法1：-基于特殊参数的排序" class="headerlink" title="方法1： 基于特殊参数的排序"></a>方法1： 基于特殊参数的排序</h5><p>建立分页对象:</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">Pageable pageable</span> = new PageRequest(pageNum, pageSize);</span><br></pre></td></tr></table></figure><p>在Repository中定义相应的方法：</p><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Page&lt;Book&gt; <span class="built_in">findByOrderByNameAsc</span>(Pageable pageable); <span class="comment">// 按照名字来升序，Desc：降序,Asc：升序</span></span><br></pre></td></tr></table></figure><p>这里使用默认的字段拼接形成的方法名，从而自动解析形成对应的方法，具体见前面。</p><h5 id="方法2：-基于自定义的-Query进行排序"><a href="#方法2：-基于自定义的-Query进行排序" class="headerlink" title="方法2： 基于自定义的@Query进行排序"></a>方法2： 基于自定义的@Query进行排序</h5><p>建立分页对象：</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">Pageable pageable</span> = new PageRequest(pageNum, pageSize);</span><br></pre></td></tr></table></figure><p>在Repository中定义相应的语句：</p><figure class="highlight n1ql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">@Query(&quot;<span class="keyword">select</span> b <span class="keyword">from</span> Book b <span class="keyword">ORDER</span> <span class="keyword">BY</span> b.name <span class="keyword">ASC</span><span class="string">&quot;)</span></span><br><span class="line"><span class="string">Page&lt;Book&gt; findInOrders(Pageable pageable);</span></span><br></pre></td></tr></table></figure><h5 id="方法3：-基于Pageable中的Sort字段"><a href="#方法3：-基于Pageable中的Sort字段" class="headerlink" title="方法3： 基于Pageable中的Sort字段"></a>方法3： 基于Pageable中的Sort字段</h5><p>Pageable对象的声明：</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Sort</span> <span class="built_in">sort</span> = <span class="keyword">new</span> <span class="built_in">Sort</span>(Direction.ASC, <span class="string">&quot;name&quot;</span>);</span><br><span class="line">Pageable pageable = <span class="keyword">new</span> PageRequest(pageNum, pageSize, <span class="built_in">sort</span>);</span><br></pre></td></tr></table></figure><p>这里将Sort字段作为参数创建了Pageable对象。<br>在Repository无需声明任何新的方法，直接使用JpaRepository中继承而来的findAll(Pageable pageable）方法即可。<br>调用具体Repository中的方法如下：</p><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Page&lt;Book&gt; book <span class="operator">=</span> bookRepository.findAll(pageable)<span class="comment">;</span></span><br></pre></td></tr></table></figure><p>以上只提供的一些简单的用法，更多文档可参考<a href="https://springdoc.cn/spring-data-jpa/#preface">Spring Data JPA 中文文档 (springdoc.cn)</a></p>]]></content>
    
    
    <summary type="html">Spring Data JPA 是 Spring Data 项目的一部分，它提供了一种简化的数据访问方式，用于与关系型数据库进行交互。它基于 Java Persistence API（JPA） 标准，并提供了一套简洁的 API 和注解，使开发人员能够通过简单的 Java 对象来表示数据库表，并通过自动生成的 SQL 语句执行常见的 CRUD 操作。Spring Data JPA 通过封装 JPA 的复杂性，简化了数据访问层的开发工作，使开发人员能够更专注于业务逻辑的实现。它还提供了丰富的查询方法的定义、分页和排序支持、事务管理等功能，使开发人员能够更方便地进行数据访问和操作。</summary>
    
    
    
    <category term="Spring Boot" scheme="https://blog.natuie.net/categories/Spring-Boot/"/>
    
    
    <category term="JPA" scheme="https://blog.natuie.net/tags/JPA/"/>
    
    <category term="PostgreSQL" scheme="https://blog.natuie.net/tags/PostgreSQL/"/>
    
  </entry>
  
  <entry>
    <title>Git提交规范</title>
    <link href="https://blog.natuie.net/posts/2024/02/03/233356/"/>
    <id>https://blog.natuie.net/posts/2024/02/03/233356/</id>
    <published>2024-02-03T15:33:56.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-提交消息规范"><a href="#1-提交消息规范" class="headerlink" title="1.提交消息规范"></a>1.提交消息规范</h2><ol><li><strong>使用提交消息模板</strong>：<ul><li>创建一个提交消息模板，包括三个部分：header、body和footer。</li><li>示例模板：<figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 提交消息模板</span></span><br><span class="line"><span class="comment">## 头部（必填）</span></span><br><span class="line"><span class="variable">&lt;类型&gt;</span>(<span class="variable">&lt;范围&gt;</span>): <span class="variable">&lt;标题&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## 主体（选填）</span></span><br><span class="line"><span class="variable">&lt;空一行&gt;</span></span><br><span class="line"><span class="variable">&lt;详细描述更改、解决的问题、相关issues等&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## 底部（选填）</span></span><br><span class="line"><span class="variable">&lt;空一行&gt;</span></span><br><span class="line"><span class="variable">&lt;关闭相关issues的标记&gt;</span></span><br></pre></td></tr></table></figure></li></ul></li><li><strong>提交类型</strong>：<ul><li>类型用于说明 commit 的目的，常见的 commit 类型包括：feat（新特性）、fix（修复问题）、docs（文档更新）、style（样式更新）、refactor（代码重构）、test（测试更新）等。</li></ul></li><li><strong>范围</strong>：<ul><li>范围用于说明 commit 影响的范围，如 frontend、backend、database、security 等。</li></ul></li><li><strong>标题</strong>：<ul><li>标题应简洁明了，准确反映 commit 的主要目的。</li></ul></li><li><strong>主体</strong>：<ul><li>主体部分应详细描述 commit 的更改内容、解决的问题和相关的 issues。</li><li>可以使用 markdown 格式来增强提交消息的可读性。</li></ul></li><li><strong>底部</strong>：<ul><li>底部可以标记关闭相关的 issues。例如：”Closes #123”，”Fixes #456”。</li></ul></li><li><strong>遵循一致的命名约定</strong>：<ul><li>尽量使用小写字母和破折号，如：”feat-add-comment-function”。</li><li>避免使用大写字母和下划线。</li></ul></li><li><strong>不要在提交消息中包含特殊字符</strong>：<ul><li>避免在提交消息中使用特殊字符，如中文、特殊符号等，以免引起解析错误。</li></ul></li><li><strong>保持简洁</strong>：<ul><li>尽量保持提交消息的简洁，避免过长的描述。</li></ul></li><li><strong>使用英文</strong>：<ul><li>虽然可以使用其他语言，但英文是 Git 社区中最常用的语言，使用英文可以确保更广泛的参与和理解。</li></ul></li></ol><h2 id="2-实际提交步骤"><a href="#2-实际提交步骤" class="headerlink" title="2. 实际提交步骤"></a>2. 实际提交步骤</h2><h4 id="2-1-初始化仓库"><a href="#2-1-初始化仓库" class="headerlink" title="2.1 初始化仓库"></a>2.1 初始化仓库</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br></pre></td></tr></table></figure><h4 id="2-2-添加文件到仓库"><a href="#2-2-添加文件到仓库" class="headerlink" title="2.2 添加文件到仓库"></a>2.2 添加文件到仓库</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br></pre></td></tr></table></figure><h4 id="2-3-提交更改"><a href="#2-3-提交更改" class="headerlink" title="2.3 提交更改"></a>2.3 提交更改</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit</span><br></pre></td></tr></table></figure><p>这将启动一个文本编辑器，您可以在这个编辑器中输入提交消息。如果您在命令行中直接输入提交消息，也可以直接按 <code>Enter</code> 键。</p><h4 id="2-4-查看提交历史"><a href="#2-4-查看提交历史" class="headerlink" title="2.4 查看提交历史"></a>2.4 查看提交历史</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br></pre></td></tr></table></figure><h4 id="2-5-创建分支"><a href="#2-5-创建分支" class="headerlink" title="2.5 创建分支"></a>2.5 创建分支</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch feature-user-registration</span><br></pre></td></tr></table></figure><h4 id="2-6-切换到新分支"><a href="#2-6-切换到新分支" class="headerlink" title="2.6 切换到新分支"></a>2.6 切换到新分支</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout feature-user-registration</span><br></pre></td></tr></table></figure><h4 id="2-7-继续开发"><a href="#2-7-继续开发" class="headerlink" title="2.7 继续开发"></a>2.7 继续开发</h4><p>在分支上继续工作，进行多次提交。</p><h4 id="2-8-合并分支"><a href="#2-8-合并分支" class="headerlink" title="2.8 合并分支"></a>2.8 合并分支</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge feature-user-registration</span><br></pre></td></tr></table></figure><h4 id="2-9-推送更改到远程仓库"><a href="#2-9-推送更改到远程仓库" class="headerlink" title="2.9 推送更改到远程仓库"></a>2.9 推送更改到远程仓库</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin main</span><br></pre></td></tr></table></figure><h4 id="2-10-推送到特定分支"><a href="#2-10-推送到特定分支" class="headerlink" title="2.10 推送到特定分支"></a>2.10 推送到特定分支</h4><p>如果需要将更改推送到特定的远程分支，可以指定分支名称：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin feature-user-registration</span><br></pre></td></tr></table></figure><h4 id="2-11-删除本地分支"><a href="#2-11-删除本地分支" class="headerlink" title="2.11 删除本地分支"></a>2.11 删除本地分支</h4><p>在合并分支后，可以删除本地分支：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -d feature-user-registration</span><br></pre></td></tr></table></figure><h4 id="2-12-删除远程分支"><a href="#2-12-删除远程分支" class="headerlink" title="2.12 删除远程分支"></a>2.12 删除远程分支</h4><p>如果不再需要远程分支，可以删除它：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin --delete feature-user-registration</span><br></pre></td></tr></table></figure><h3 id="提交消息实例"><a href="#提交消息实例" class="headerlink" title="提交消息实例"></a>提交消息实例</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">feat(auth): Implement user registration form</span><br><span class="line">Added a new form for user registration that collects name, email, and password. Added basic validation to ensure data integrity.</span><br><span class="line">Closes #247</span><br></pre></td></tr></table></figure><p>在这个实例中：</p><ul><li><code>feat(auth)</code> 表示这是一个新特性（feature）提交，它影响了认证（auth）模块。</li><li><code>Implement user registration form</code> 是标题，简洁地描述了提交的目的。</li><li>主体部分详细描述了新用户注册表单的实现，包括收集的信息类型和添加的验证。</li><li>底部标记了一个相关的 issue（#247），表示这个问题已经通过这个提交解决了。</li></ul>]]></content>
    
    
    <summary type="html">Git提交规范是团队协作中非常重要的一环，它有助于保持代码库的整洁和易于理解。通过遵循一致的提交规范，团队成员可以快速理解每次提交的目的和更改的内容。本指南将介绍如何制定和遵循Git提交规范。</summary>
    
    
    
    <category term="Git" scheme="https://blog.natuie.net/categories/Git/"/>
    
    
    <category term="Git" scheme="https://blog.natuie.net/tags/Git/"/>
    
    <category term="规范" scheme="https://blog.natuie.net/tags/%E8%A7%84%E8%8C%83/"/>
    
  </entry>
  
  <entry>
    <title>Git基本的使用指南</title>
    <link href="https://blog.natuie.net/posts/2024/02/03/233341/"/>
    <id>https://blog.natuie.net/posts/2024/02/03/233341/</id>
    <published>2024-02-03T15:33:41.000Z</published>
    <updated>2025-08-16T15:24:59.573Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文章只提供常用的一些用法，更多的可参考下方的官方文档！</p></blockquote><h2 id="一、基础知识"><a href="#一、基础知识" class="headerlink" title="一、基础知识"></a>一、基础知识</h2><ol><li>安装Git：首先，您需要在您的计算机上安装Git。您可以从Git官网 <a href="https://git-scm.com/download">下载</a> 并安装适合您操作系统的Git版本。</li><li>配置Git：在开始使用Git之前，您需要配置您的用户信息。运行以下命令来设置您的用户名和电子邮件：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name <span class="string">&quot;Your Name&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;your_email@example.com&quot;</span></span><br></pre></td></tr></table></figure></li><li>创建新仓库：要创建一个新的Git仓库，您可以初始化一个现有的目录或创建一个新目录并初始化：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br></pre></td></tr></table></figure></li><li>添加文件：将文件添加到Git仓库的暂存区，准备提交：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add &lt;file&gt;</span><br></pre></td></tr></table></figure></li><li>提交更改：将暂存区的文件提交到仓库，并附加一条提交消息：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m <span class="string">&quot;提交的信息&quot;</span></span><br></pre></td></tr></table></figure></li><li>查看状态：查看当前仓库的状态，包括未提交的更改和分支信息：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure></li><li>查看日志：查看提交历史记录（包括提交的哈希值、作者、日期、提交信息）：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br></pre></td></tr></table></figure></li><li>查看特定提交的内容（提交的详细信息，包括提交的哈希值、作者、日期、提交信息、文件内容以及更改的文件列表）：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git show &lt;commit-hash&gt;</span><br></pre></td></tr></table></figure></li><li>查看特定文件在特定提交中的内容（上同）：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git show &lt;commit-hash&gt;:&lt;path/to/file&gt;</span><br></pre></td></tr></table></figure>这里 <code>&lt;path/to/file&gt;</code> 是你想要查看的文件的路径。</li></ol><blockquote><p>在Git版本控制系统中， <code>commit-hash</code>是一个提交（commit）的唯一标识符。每个提交都有一个与之关联的哈希值，这个哈希值是通过SHA-1哈希算法生成的，它保证了每个提交的唯一性。 当你需要引用一个特定的提交时，可以使用其哈希值。<br>可以使用<code>git log</code>来获取提交的哈希值。</p></blockquote><h2 id="二、分支管理"><a href="#二、分支管理" class="headerlink" title="二、分支管理"></a>二、分支管理</h2><ol><li>创建分支：创建一个新的分支：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li><li>切换分支：切换到已存在的分支：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li><li>创建并切换分支：创建一个新分支并立即切换到该分支：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li><li>合并分支：将一个分支的更改合并到当前分支：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li><li>删除分支：删除一个已合并的分支：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -d &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li></ol><h2 id="三、远程操作"><a href="#三、远程操作" class="headerlink" title="三、远程操作"></a>三、远程操作</h2><ol><li>添加远程仓库：将一个远程仓库添加到本地仓库：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote add &lt;remote_name&gt; &lt;remote_url&gt;</span><br></pre></td></tr></table></figure></li><li>克隆远程仓库：从远程仓库克隆到本地：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> &lt;remote_url&gt;</span><br></pre></td></tr></table></figure></li><li>拉取远程分支：从远程仓库拉取最新的更改：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git pull &lt;remote_name&gt; &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li><li>推送本地分支：将本地分支的更改推送到远程仓库：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push &lt;remote_name&gt; &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li></ol><h2 id="四、高级功能"><a href="#四、高级功能" class="headerlink" title="四、高级功能"></a>四、高级功能</h2><ol><li><p>标签管理：为特定的提交创建标签：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag &lt;tag_name&gt;</span><br></pre></td></tr></table></figure></li><li><p>撤销更改：撤销已提交的更改：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git revert &lt;commit_hash&gt;</span><br></pre></td></tr></table></figure></li><li><p>变基操作：将一个分支的更改应用到另一个分支上：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase &lt;branch_name&gt;</span><br></pre></td></tr></table></figure></li><li><p>解决冲突：当合并分支时出现冲突，解决冲突并手动合并更改。</p><p>后面会较详细介绍</p></li></ol><h2 id="五、工作流程"><a href="#五、工作流程" class="headerlink" title="五、工作流程"></a>五、工作流程</h2><p>Git 的工作流程通常包括以下几个步骤：</p><ol><li><strong>修改文件</strong>：在本地工作目录中修改文件。</li><li><strong>暂存更改</strong>：使用 <code>git add</code> 命令将更改添加到暂存区。</li><li><strong>提交更改</strong>：使用 <code>git commit</code> 命令将暂存区的更改提交到仓库。</li><li><strong>推送更改</strong>：如果有远程仓库，使用 <code>git push</code> 命令将本地提交推送到远程仓库。<br>了解这些基本步骤有助于更好地理解 Git 的工作原理。</li></ol><h2 id="六、文件状态转换"><a href="#六、文件状态转换" class="headerlink" title="六、文件状态转换"></a>六、文件状态转换</h2><p>文件在 Git 中的状态转换通常如下：</p><ol><li><strong>未跟踪（Untracked）</strong>：文件尚未被 Git 追踪。</li><li><strong>已暂存（Staged）</strong>：文件已被添加到暂存区，等待被提交。</li><li><strong>已提交（Committed）</strong>：文件已被提交到仓库。<br>了解这些状态转换有助于更好地管理文件的更改。</li></ol><h2 id="七、分支的详细解释"><a href="#七、分支的详细解释" class="headerlink" title="七、分支的详细解释"></a>七、分支的详细解释</h2><p>分支是 Git 中一个非常重要的概念。它允许您在不影响主代码库的情况下进行实验和开发。以下是对分支的一些详细解释：</p><ol><li><strong>主分支（Master&#x2F;Main）</strong>：通常是项目的默认分支，用于稳定和可发布的代码。</li><li><strong>特性分支（Feature）</strong>：用于开发新功能或实验性更改。</li><li><strong>修复分支（Hotfix）</strong>：用于快速修复生产环境中的问题。<br>了解不同类型的分支以及如何使用它们有助于更好地组织代码库。</li></ol><h2 id="八、远程操作的图解"><a href="#八、远程操作的图解" class="headerlink" title="八、远程操作的图解"></a>八、远程操作的图解</h2><p>以下是本地仓库与远程仓库之间的基本交互图解：</p><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">本地仓库</span><br><span class="line">  <span class="string">|</span></span><br><span class="line">  <span class="string">| (git push)</span></span><br><span class="line">  V</span><br><span class="line">远程仓库</span><br></pre></td></tr></table></figure><p>了解本地仓库与远程仓库之间的交互有助于更好地进行团队协作和版本控制。</p><h2 id="九、解决合并冲突的步骤"><a href="#九、解决合并冲突的步骤" class="headerlink" title="九、解决合并冲突的步骤"></a>九、解决合并冲突的步骤</h2><p>当合并分支时出现冲突时，通常需要手动解决。以下是一些解决合并冲突的步骤：</p><h3 id="1-查看冲突文件"><a href="#1-查看冲突文件" class="headerlink" title="1. 查看冲突文件"></a>1. 查看冲突文件</h3><p>当发生冲突时，Git 会停止合并过程，并提示您查看冲突文件。这些文件通常以 <code>.orig</code> 或 <code>.rej</code> 结尾，表示原始文件和被拒绝的更改。<br>您可以使用 <code>git status</code> 命令来查看哪些文件存在冲突：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure><h3 id="2-解决冲突"><a href="#2-解决冲突" class="headerlink" title="2. 解决冲突"></a>2. 解决冲突</h3><p>解决冲突通常需要手动编辑冲突文件。Git 会在冲突文件中添加特殊的标记，如 <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code>, <code>=======</code>, 和 <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code>。这些标记分隔了不同分支的更改。</p><ul><li><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code>：表示来自第一个分支的更改。</li><li><code>=======</code>：表示分隔线。</li><li><code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code>：表示来自第二个分支的更改。<br>您需要手动选择保留哪些更改，并删除其他更改。解决冲突后，您可以使用 <code>git add</code> 命令将文件添加到暂存区，并继续合并或变基操作。</li></ul><h3 id="3-继续合并或变基"><a href="#3-继续合并或变基" class="headerlink" title="3. 继续合并或变基"></a>3. 继续合并或变基</h3><p>解决所有冲突后，您可以继续合并或变基操作。使用以下命令继续合并：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge --<span class="built_in">continue</span></span><br></pre></td></tr></table></figure><p>或者，如果您在变基操作中遇到冲突，可以使用以下命令继续变基：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase --<span class="built_in">continue</span></span><br></pre></td></tr></table></figure><h3 id="4-跳过冲突"><a href="#4-跳过冲突" class="headerlink" title="4. 跳过冲突"></a>4. 跳过冲突</h3><p>如果您不想解决某些冲突，可以跳过它们。使用以下命令跳过所有冲突并继续合并或变基操作：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge --abort</span><br></pre></td></tr></table></figure><p>或者，如果您在变基操作中遇到冲突，可以使用以下命令跳过所有冲突并继续变基：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase --abort</span><br></pre></td></tr></table></figure><h3 id="5-解决冲突的其他方法"><a href="#5-解决冲突的其他方法" class="headerlink" title="5. 解决冲突的其他方法"></a>5. 解决冲突的其他方法</h3><p>除了手动解决冲突，您还可以使用 <code>git mergetool</code> 命令来解决冲突。<code>git mergetool</code> 命令会启动一个图形化工具，可帮助您解决合并冲突。</p><h2 id="十、高级功能的深入介绍"><a href="#十、高级功能的深入介绍" class="headerlink" title="十、高级功能的深入介绍"></a>十、高级功能的深入介绍</h2><h2 id="标签（Tag）"><a href="#标签（Tag）" class="headerlink" title="标签（Tag）"></a>标签（Tag）</h2><p>在 Git 中，标签（tag）是一种轻量级的提交引用，它指向提交对象（commit）。标签通常用于标记特定的提交，比如软件版本发布或者里程碑。标签是不可变的历史记录，一旦创建就不能被修改。</p><h3 id="创建标签"><a href="#创建标签" class="headerlink" title="创建标签"></a>创建标签</h3><p>创建标签有几种方法：</p><ol><li><strong>使用 <code>git tag</code> 命令</strong>：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag &lt;tag_name&gt;</span><br></pre></td></tr></table></figure>这会在当前分支的最近提交上创建一个标签。</li><li><strong>给旧提交创建标签</strong>：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag &lt;tag_name&gt; &lt;commit_hash&gt;</span><br></pre></td></tr></table></figure>这允许您给之前的提交创建一个标签。</li><li><strong>使用 <code>-a</code> 选项创建带有信息的标签</strong>：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -a &lt;tag_name&gt; -m <span class="string">&quot;Release v1.0.0&quot;</span> &lt;commit_hash&gt;</span><br></pre></td></tr></table></figure>这会在指定提交的哈希值上创建一个标签，并附带一个信息（message）。</li><li><strong>使用 <code>-m</code> 选项创建带有信息的标签</strong>：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -m <span class="string">&quot;Release v1.0.0&quot;</span> &lt;tag_name&gt;</span><br></pre></td></tr></table></figure>这会在当前分支的最近提交上创建一个标签，并附带一个信息。</li></ol><h3 id="查看标签"><a href="#查看标签" class="headerlink" title="查看标签"></a>查看标签</h3><p>要查看所有标签，可以使用 <code>git tag</code> 命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag</span><br></pre></td></tr></table></figure><p>这会列出所有已创建的标签。</p><h3 id="删除标签"><a href="#删除标签" class="headerlink" title="删除标签"></a>删除标签</h3><p>要删除一个标签，可以使用 <code>git tag -d &lt;tag_name&gt;</code> 命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -d v1.0.0</span><br></pre></td></tr></table></figure><p>这将删除名为 <code>v1.0.0</code> 的标签。</p><h3 id="推送标签到远程仓库"><a href="#推送标签到远程仓库" class="headerlink" title="推送标签到远程仓库"></a>推送标签到远程仓库</h3><p>如果您的标签仅在本地创建，它们不会自动推送到远程仓库。要推送标签到远程仓库，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin &lt;tag_name&gt;</span><br></pre></td></tr></table></figure><p>或者，如果您想要推送所有本地标签到远程仓库，可以使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin --tags</span><br></pre></td></tr></table></figure><h3 id="拉取远程仓库的标签"><a href="#拉取远程仓库的标签" class="headerlink" title="拉取远程仓库的标签"></a>拉取远程仓库的标签</h3><p>如果您想要拉取远程仓库的标签到本地，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin --tags</span><br></pre></td></tr></table></figure><p>这将拉取远程仓库的所有标签到本地，但不会自动添加到本地标签列表中。</p><h3 id="打标签的注意事项"><a href="#打标签的注意事项" class="headerlink" title="打标签的注意事项"></a>打标签的注意事项</h3><ul><li><strong>不可变性</strong>：一旦创建，标签是不可变的，这意味着您不能修改或删除它们。</li><li><strong>历史记录</strong>：标签作为提交历史的引用，不会随着时间推移而改变。</li><li><strong>安全</strong>：标签可以被加密，以保护敏感信息。</li><li><strong>远程标签</strong>：标签可以存储在远程仓库中，也可以只存储在本地。</li></ul><h2 id="变基（Rebase）"><a href="#变基（Rebase）" class="headerlink" title="变基（Rebase）"></a>变基（Rebase）</h2><p>在Git中，变基（rebase）是一种将一系列提交移动到新基础的操作。它通常用于将一个分支的更改合并到另一个分支上，或者在进行交互式变基时重新排列、编辑或压缩提交。变基可以改变历史记录，因此在公共分支上使用时需要格外小心。</p><h3 id="基本变基操作"><a href="#基本变基操作" class="headerlink" title="基本变基操作"></a>基本变基操作</h3><p>假设你有两个分支：<code>master</code> 和 <code>feature</code>。你想要将 <code>feature</code> 分支上的更改合并到 <code>master</code> 分支上，但不想创建合并提交。你可以使用变基来实现这一点：</p><ol><li>首先，切换到 <code>feature</code> 分支：</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout feature</span><br></pre></td></tr></table></figure><ol start="2"><li>然后，将 <code>feature</code> 分支变基到 <code>master</code> 分支：</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase master</span><br></pre></td></tr></table></figure><p>这会将 <code>feature</code> 分支上的所有提交移动到 <code>master</code> 分支的最新提交之后。</p><h3 id="交互式变基"><a href="#交互式变基" class="headerlink" title="交互式变基"></a>交互式变基</h3><p>交互式变基允许你在变基过程中修改提交。这可以用来合并多个提交、修改提交信息、删除提交或重新排序提交。</p><p>要进行交互式变基，使用 <code>-i</code> 或 <code>--interactive</code> 选项：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase -i master</span><br></pre></td></tr></table></figure><p>这将打开一个文本编辑器，列出 <code>feature</code> 分支上所有从 <code>master</code> 分支分叉之后的提交。你可以在这里选择要进行的操作，比如 <code>pick</code>（保留提交）、<code>reword</code>（修改提交信息）、<code>edit</code>（修改提交内容）、<code>squash</code>（合并提交）等。</p><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ul><li><strong>不要在公共分支上变基</strong>：如果你已经将变基后的分支推送到远程仓库，那么在公共分支上使用变基可能会导致其他协作者的仓库出现冲突。在进行变基之前，最好先与团队成员沟通。</li><li><strong>使用变基前备份</strong>：在执行变基操作之前，最好备份你的工作，以防万一。</li><li><strong>解决冲突</strong>：在变基过程中，你可能会遇到冲突。你需要手动解决这些冲突，然后使用 <code>git add</code> 标记冲突已解决，最后使用 <code>git rebase --continue</code> 继续变基过程。</li></ul><h2 id="diff-命令"><a href="#diff-命令" class="headerlink" title="diff 命令"></a><code>diff</code> 命令</h2><p><code>diff</code> 命令用于显示工作目录、暂存区和上一个提交之间的差异。它可以帮助您了解哪些文件被添加、修改或删除，以及这些更改的具体内容。</p><h3 id="1-查看工作目录与暂存区之间的差异"><a href="#1-查看工作目录与暂存区之间的差异" class="headerlink" title="1. 查看工作目录与暂存区之间的差异"></a>1. 查看工作目录与暂存区之间的差异</h3><p>要查看工作目录与暂存区之间的差异，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff</span><br></pre></td></tr></table></figure><p>这会显示所有已跟踪文件的工作目录与暂存区之间的差异。</p><h3 id="2-查看工作目录与上次提交之间的差异"><a href="#2-查看工作目录与上次提交之间的差异" class="headerlink" title="2. 查看工作目录与上次提交之间的差异"></a>2. 查看工作目录与上次提交之间的差异</h3><p>要查看工作目录与上次提交之间的差异，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff HEAD</span><br></pre></td></tr></table></figure><p>这会显示工作目录与上次提交之间的差异。</p><h3 id="3-查看暂存区与上次提交之间的差异"><a href="#3-查看暂存区与上次提交之间的差异" class="headerlink" title="3. 查看暂存区与上次提交之间的差异"></a>3. 查看暂存区与上次提交之间的差异</h3><p>要查看暂存区与上次提交之间的差异，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff --cached</span><br></pre></td></tr></table></figure><p>这会显示暂存区与上次提交之间的差异。</p><h3 id="4-查看两个提交之间的差异"><a href="#4-查看两个提交之间的差异" class="headerlink" title="4. 查看两个提交之间的差异"></a>4. 查看两个提交之间的差异</h3><p>要查看两个提交之间的差异，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff &lt;commit_hash_1&gt; &lt;commit_hash_2&gt;</span><br></pre></td></tr></table></figure><p>这会显示两个提交之间的差异。</p><h3 id="5-查看多个提交之间的差异"><a href="#5-查看多个提交之间的差异" class="headerlink" title="5. 查看多个提交之间的差异"></a>5. 查看多个提交之间的差异</h3><p>要查看多个提交之间的差异，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff &lt;commit_hash_1&gt;..&lt;commit_hash_2&gt;</span><br></pre></td></tr></table></figure><p>这会显示两个提交之间的差异。</p><h2 id="log-命令"><a href="#log-命令" class="headerlink" title="log 命令"></a><code>log</code> 命令</h2><p><code>log</code> 命令用于显示提交历史记录。它可以帮助您查看提交的时间、作者、提交信息等信息。</p><h3 id="1-查看提交历史"><a href="#1-查看提交历史" class="headerlink" title="1. 查看提交历史"></a>1. 查看提交历史</h3><p>要查看提交历史，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br></pre></td></tr></table></figure><p>这会显示提交历史记录，包括提交的时间、作者、提交信息等信息。</p><h3 id="2-查看特定提交的历史"><a href="#2-查看特定提交的历史" class="headerlink" title="2. 查看特定提交的历史"></a>2. 查看特定提交的历史</h3><p>要查看特定提交的历史，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> &lt;commit_hash&gt;</span><br></pre></td></tr></table></figure><p>这会显示指定提交的历史记录。</p><h3 id="3-查看提交日志的格式化输出"><a href="#3-查看提交日志的格式化输出" class="headerlink" title="3. 查看提交日志的格式化输出"></a>3. 查看提交日志的格式化输出</h3><p>要查看提交日志的格式化输出，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --oneline</span><br></pre></td></tr></table></figure><p>这会显示提交日志的简洁格式化输出。</p><h3 id="4-查看提交日志的详细信息"><a href="#4-查看提交日志的详细信息" class="headerlink" title="4. 查看提交日志的详细信息"></a>4. 查看提交日志的详细信息</h3><p>要查看提交日志的详细信息，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --graph --oneline</span><br></pre></td></tr></table></figure><p>这会显示提交日志的图形化格式化输出。</p><h3 id="5-查看特定文件的历史更改"><a href="#5-查看特定文件的历史更改" class="headerlink" title="5. 查看特定文件的历史更改"></a>5. 查看特定文件的历史更改</h3><p>要查看特定文件的历史更改，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> -- &lt;file_path&gt;</span><br></pre></td></tr></table></figure><p>这会显示指定文件的历史更改。</p><h2 id="撤销更改"><a href="#撤销更改" class="headerlink" title="撤销更改"></a>撤销更改</h2><p>在 Git 中，撤销更改通常指的是回退到之前的某个提交状态。撤销更改可以通过几种不同的方式实现，具体取决于您想要撤销的是已提交的更改还是未提交的更改。以下是一些常见的撤销更改的方法：</p><h3 id="使用-git-reset-撤销更改"><a href="#使用-git-reset-撤销更改" class="headerlink" title="使用 git reset 撤销更改"></a>使用 <code>git reset</code> 撤销更改</h3><p><code>git reset</code> 命令用于将当前分支的HEAD指针移动到指定的提交，同时可以选择性地重置暂存区和工作目录。它有三种主要模式：<code>--soft</code>, <code>--mixed</code>（默认），和 <code>--hard</code>。</p><ol><li><p><strong>撤销提交但保留更改</strong> (<code>--soft</code>):</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --soft &lt;commit-hash&gt;</span><br></pre></td></tr></table></figure><p> 这将撤销提交，但保留更改在暂存区。</p></li><li><p><strong>撤销提交并重置暂存区</strong> (<code>--mixed</code>):</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset &lt;commit-hash&gt;</span><br></pre></td></tr></table></figure><p> 这将撤销提交并重置暂存区，但保留更改在工作目录。</p></li><li><p><strong>撤销提交并丢弃更改</strong> (<code>--hard</code>):</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --hard &lt;commit-hash&gt;</span><br></pre></td></tr></table></figure><p> 这将撤销提交并丢弃所有更改，包括工作目录中的更改。</p></li></ol><p>假设你有以下提交历史：</p><figure class="highlight brainfuck"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">A</span> <span class="literal">--</span> <span class="comment">B</span> <span class="literal">--</span> <span class="comment">C</span> <span class="literal">--</span> <span class="comment">D (HEAD)</span></span><br></pre></td></tr></table></figure><p>如果你想要撤销提交 <code>C</code>，你可以使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --hard B</span><br></pre></td></tr></table></figure><p>这将把HEAD指针移动到提交 <code>B</code>，丢弃 <code>C</code> 和 <code>D</code> 的更改。</p><h3 id="使用-git-revert-撤销更改"><a href="#使用-git-revert-撤销更改" class="headerlink" title="使用 git revert 撤销更改"></a>使用 <code>git revert</code> 撤销更改</h3><p><code>git revert</code> 命令用于创建一个新的提交，该提交撤销了指定提交所做的更改。它不会改变历史记录，而是通过添加一个新的提交来记录撤销操作。</p><h4 id="撤销更改-1"><a href="#撤销更改-1" class="headerlink" title="撤销更改"></a>撤销更改</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git revert &lt;commit-hash&gt;</span><br></pre></td></tr></table></figure><p>假设你有以下提交历史：</p><figure class="highlight brainfuck"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">A</span> <span class="literal">--</span> <span class="comment">B</span> <span class="literal">--</span> <span class="comment">C</span> <span class="literal">--</span> <span class="comment">D (HEAD)</span></span><br></pre></td></tr></table></figure><p>如果你想要撤销提交 <code>C</code>，你可以使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git revert C</span><br></pre></td></tr></table></figure><p>这将创建一个新的提交 <code>E</code>，它撤销了提交 <code>C</code> 的更改。提交 <code>E</code> 将成为新的HEAD。</p><h4 id="撤销最近提交"><a href="#撤销最近提交" class="headerlink" title="撤销最近提交"></a>撤销最近提交</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git revert HEAD~&lt;number_of_commits&gt;</span><br></pre></td></tr></table></figure><p>Git会创建一个新的提交，该提交将撤销最近一次提交（即HEAD指向的提交）所做的更改。</p><p>这里，<code>HEAD</code> 是一个特殊的指针，它指向当前检出的分支的最新提交。因此，<code>git revert HEAD</code> 实际上是撤销了当前分支上最新的提交所做的更改。<br>这将创建一个新的提交，撤销指定数量的上一个提交，用于撤销一个或多个提交所做的更改。</p><p>假设你想要撤销最近的两个提交，你可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git revert HEAD~2</span><br></pre></td></tr></table></figure><h3 id="注意事项-1"><a href="#注意事项-1" class="headerlink" title="注意事项"></a>注意事项</h3><ul><li>使用 <code>git reset</code> 时要小心，因为它会丢弃更改。</li><li>使用 <code>git revert</code> 时，确保你理解了将要撤销的更改，因为这将创建一个新的提交。这可能会影响提交历史和分支结构。</li><li>使用 <code>git revert</code> 而不是 <code>git reset</code> 的好处是，它不会改变历史记录，而是通过创建一个新的提交来记录撤销操作，这样可以保持历史的完整性，并且不会影响其他协作者的工作。</li></ul><p>通过理解这两个命令的不同，你可以根据需要选择最合适的命令来撤销更改。</p><h2 id="十一、安全性考虑"><a href="#十一、安全性考虑" class="headerlink" title="十一、安全性考虑"></a>十一、安全性考虑</h2><p>使用 Git 时，安全性是一个重要的考虑因素。以下是一些安全性建议：</p><ol><li><strong>保护密钥</strong>：使用 SSH 密钥或 HTTPS 令牌进行身份验证，并确保它们得到妥善保护。</li><li><strong>访问控制</strong>：设置适当的权限和访问控制，以限制对代码库的访问。</li><li><strong>定期更新</strong>：定期更新 Git 和相关工具，以确保安全性漏洞得到修复。<br>了解如何保护代码库和密钥有助于确保代码的安全性。</li></ol><h2 id="十二、技巧"><a href="#十二、技巧" class="headerlink" title="十二、技巧"></a>十二、技巧</h2><p>以下是一些使用 Git 的技巧：</p><ol><li><strong>定期推送到远程仓库</strong>：定期将更改推送到远程仓库，以保持备份和同步。</li><li><strong>保持分支的清洁</strong>：定期清理分支，删除不再需要的分支。</li><li><strong>使用描述性的提交消息</strong>：编写清晰、描述性的提交消息，以便于理解代码的更改。<br>了解这些最佳实践和技巧有助于更好地使用 Git。</li></ol><h2 id="十三、资源和进一步学习"><a href="#十三、资源和进一步学习" class="headerlink" title="十三、资源和进一步学习"></a>十三、资源和进一步学习</h2><p>以下是一些学习 Git 的资源和进一步学习的建议：</p><ol><li><strong>官方文档</strong>：Git 的官方文档是学习 Git 的最佳起点。您可以在 <a href="https://git-scm.com/">git-scm.com</a> 上找到官方文档。</li><li><strong>在线教程</strong>：许多在线平台提供了 Git 的教程和课程，例如 GitHub、GitLab 等。</li><li><strong>书籍</strong>：有许多关于 Git 的优秀书籍，例如《Pro Git》和《Git Pocket Guide》。<br>了解这些资源和进一步学习的建议有助于深入理解 Git。<br>通过添加这些内容，您的博客文章将更加全面和有用，能够帮助读者更好地理解和使用 Git。</li></ol>]]></content>
    
    
    <summary type="html">Git是一个强大的分布式版本控制系统，被广泛应用于开源项目和私人项目。它允许多个开发者协作开发同一个项目，同时记录对文件的修改历史。本指南将带您从Git的基础知识开始，逐步深入了解Git的高级功能。</summary>
    
    
    
    <category term="Git" scheme="https://blog.natuie.net/categories/Git/"/>
    
    
    <category term="Git" scheme="https://blog.natuie.net/tags/Git/"/>
    
    <category term="指南" scheme="https://blog.natuie.net/tags/%E6%8C%87%E5%8D%97/"/>
    
  </entry>
  
  <entry>
    <title>深入理解RESTful风格接口的设计与应用</title>
    <link href="https://blog.natuie.net/posts/2024/02/03/232901/"/>
    <id>https://blog.natuie.net/posts/2024/02/03/232901/</id>
    <published>2024-02-03T15:29:01.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<h2 id="RESTful风格接口的基本概念"><a href="#RESTful风格接口的基本概念" class="headerlink" title="RESTful风格接口的基本概念"></a>RESTful风格接口的基本概念</h2><ol><li><strong>资源（Resource）</strong>：RESTful架构中的核心概念是资源，它可以是任何可以命名的事物，如用户、商品、订单等。每个资源都应该有一个唯一的URI作为其标识。</li><li><strong>统一接口（Uniform Interface）</strong>：RESTful架构要求通过统一的接口对资源进行操作，包括GET、POST、PUT、DELETE等HTTP方法。统一接口的原则有助于提高接口的可读性和可维护性。</li><li><strong>URI（Uniform Resource Identifier）</strong>：每个资源都应该有一个唯一的URI作为其标识。URI应该能够直观地表示资源的层次结构和类型。</li><li><strong>无状态（Stateless）</strong>：RESTful架构要求每个请求都是独立的，服务器不会保存任何关于客户端状态的信息。这有助于提高系统的可扩展性和可靠性。</li></ol><h2 id="RESTful风格接口的设计原则"><a href="#RESTful风格接口的设计原则" class="headerlink" title="RESTful风格接口的设计原则"></a>RESTful风格接口的设计原则</h2><ol><li><strong>使用HTTP方法表示操作</strong>：GET用于获取资源，POST用于创建资源，PUT用于更新资源，DELETE用于删除资源。通过使用不同的HTTP方法，可以清晰地表示对资源的不同操作。</li><li><strong>使用URI表示资源</strong>：URI应该能够直观地表示资源的层次结构和类型。例如，可以使用”&#x2F;users”表示用户资源，使用”&#x2F;users&#x2F;{user_id}&#x2F;articles”表示特定用户的文章资源。</li><li><strong>使用JSON或XML作为数据格式</strong>：RESTful接口通常使用JSON或XML格式来传输数据。JSON格式轻量级且易于阅读，因此在现代Web开发中得到了广泛应用。</li><li><strong>提供适当的错误处理</strong>：接口应该能够返回清晰的错误信息，包括错误码和错误描述。这有助于快速定位和解决问题。</li></ol><h2 id="RESTful风格接口的应用实例"><a href="#RESTful风格接口的应用实例" class="headerlink" title="RESTful风格接口的应用实例"></a>RESTful风格接口的应用实例</h2><p>接下来，我们将通过一个简单的实例来展示如何设计一个RESTful风格的接口。假设我们要实现一个简单的博客系统，包括用户和文章两个资源。</p><h3 id="设计URI"><a href="#设计URI" class="headerlink" title="设计URI"></a>设计URI</h3><ul><li>用户资源：<code>/users</code></li><li>文章资源：<code>/users/&#123;user_id&#125;/articles</code></li></ul><h3 id="设计HTTP方法"><a href="#设计HTTP方法" class="headerlink" title="设计HTTP方法"></a>设计HTTP方法</h3><ul><li>获取用户列表：<code>GET /users</code></li><li>创建新用户：<code>POST /users</code></li><li>获取指定用户：<code>GET /users/&#123;user_id&#125;</code></li><li>更新指定用户：<code>PUT /users/&#123;user_id&#125;</code></li><li>删除指定用户：<code>DELETE /users/&#123;user_id&#125;</code></li><li>获取指定用户的文章列表：<code>GET /users/&#123;user_id&#125;/articles</code></li><li>创建新文章：<code>POST /users/&#123;user_id&#125;/articles</code></li><li>获取指定文章：<code>GET /users/&#123;user_id&#125;/articles/&#123;article_id&#125;</code></li><li>更新指定文章：<code>PUT /users/&#123;user_id&#125;/articles/&#123;article_id&#125;</code></li><li>删除指定文章：<code>DELETE /users/&#123;user_id&#125;/articles/&#123;article_id&#125;</code></li></ul><h3 id="设计响应数据格式"><a href="#设计响应数据格式" class="headerlink" title="设计响应数据格式"></a>设计响应数据格式</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;code&quot;</span><span class="punctuation">:</span> <span class="number">200</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;message&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Success&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;data&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;user_id&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;username&quot;</span><span class="punctuation">:</span> <span class="string">&quot;John&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;email&quot;</span><span class="punctuation">:</span> <span class="string">&quot;john@example.com&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="实现接口"><a href="#实现接口" class="headerlink" title="实现接口"></a>实现接口</h2><p>根据设计的URI和HTTP方法，我们可以使用各种编程语言和框架来实现这些接口。在实际项目中，我们通常会使用如Node.js的Express框架、Python的Flask或Django框架等来快速搭建RESTful风格的接口。</p>]]></content>
    
    
    <summary type="html">在当今的Web开发领域，RESTful风格接口已经成为了构建可扩展、易维护的Web服务的事实标准。RESTful架构充分利用了HTTP协议的幂等性、无状态性等特点，使得接口设计更加简洁、直观。本文将详细介绍RESTful风格接口的基本概念、设计原则以及如何在实际项目中应用。</summary>
    
    
    
    <category term="风格" scheme="https://blog.natuie.net/categories/%E9%A3%8E%E6%A0%BC/"/>
    
    
    <category term="规范" scheme="https://blog.natuie.net/tags/%E8%A7%84%E8%8C%83/"/>
    
    <category term="RESTful" scheme="https://blog.natuie.net/tags/RESTful/"/>
    
  </entry>
  
  <entry>
    <title>R-Studio：一款强大的数据恢复工具</title>
    <link href="https://blog.natuie.net/posts/2024/02/03/103844/"/>
    <id>https://blog.natuie.net/posts/2024/02/03/103844/</id>
    <published>2024-02-03T02:38:44.000Z</published>
    <updated>2025-08-16T15:24:59.574Z</updated>
    
    <content type="html"><![CDATA[<h3 id="R-Studio简介"><a href="#R-Studio简介" class="headerlink" title="R-Studio简介"></a>R-Studio简介</h3><p>R-Studio是一款功能强大的数据恢复软件，它支持多种文件系统和存储设备。能恢复大多数的存储设备，R-Studio能帮助用户恢复丢失、删除或格式化的数据。它采用了先进的算法和技术，能够扫描和恢复各种类型的文件，包括文档、图片、音频和视频等。</p><h3 id="R-Studio的特点和功能"><a href="#R-Studio的特点和功能" class="headerlink" title="R-Studio的特点和功能"></a>R-Studio的特点和功能</h3><p>R-Studio具有许多独特的特点和功能，使其成为数据恢复领域的佼佼者。首先，它支持多种文件系统，包括NTFS、FAT、exFAT、HFS+等，这意味着无论是Windows、Mac还是Linux系统，R-Studio都能提供数据恢复解决方案。其次，R-Studio提供了强大的扫描和恢复选项，包括快速扫描、深度扫描和文件结构分析等，以最大程度地恢复丢失的数据。此外，R-Studio还支持RAID恢复、分区恢复和加密文件恢复等功能，使其成为一个全面的数据恢复工具。R-Studio还提供了预览功能，让用户在恢复之前可以查看文件内容，以确保恢复正确的数据。</p><h3 id="使用R-Studio进行数据恢复"><a href="#使用R-Studio进行数据恢复" class="headerlink" title="使用R-Studio进行数据恢复"></a>使用R-Studio进行数据恢复</h3><p>使用R-Studio进行数据恢复相对简单。首先，需要 <a href="https://www.123pan.com/s/3VftVv-two7d.html">下载</a> 并安装R-Studio软件。  </p><p>然后，连接需要恢复数据的存储设备到计算机（也可以选择本机存储设备，而不是其他外置设备）。接下来，打开R-Studio软件并选择相应的存储设备，双击即可进行扫描文件。<br><img src="/img/post/rstudio-1.png" alt="R-Studio界面截图1"></p><p>在左侧找到“Root”点击它，然后在右侧可以看到一些文件，图标带“X”的就是被误删的文件。<br><img src="/img/post/rstudio-2.png" alt="R-Studio界面截图2"></p><p>找到你要恢复的文件，右键&#x2F;点击左上角的恢复即可恢复你要的文件。<br><img src="/img/post/rstudio-3.png" alt="R-Studio界面截图3"><br>最后将文件恢复到安全位置即可。</p><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><p>虽然R-Studio是一款强大的数据恢复工具，但在使用时仍需注意一些事项。首先，应避免在需要恢复数据的存储设备上进行任何写操作，以防止数据被覆盖。其次，恢复数据时应选择一个安全的位置保存恢复的文件，以避免数据覆盖或丢失。此外，数据恢复是一个复杂的过程，可能需要一些时间和耐心。如果不确定如何操作，建议寻求专业的数据恢复服务。</p>]]></content>
    
    
    <summary type="html">在数字时代，数据/文件丢失是一个常见且令人头疼的问题。无论是意外删除、格式化硬盘还是系统崩溃，丢失重要数据都可能导致严重的后果。幸运的是，有一款名为R-Studio的数据恢复工具可以帮助我们恢复丢失的数据。在这篇文章中，我们将探讨R-Studio的特点和功能，以及如何使用它来恢复丢失的数据。</summary>
    
    
    
    <category term="工具" scheme="https://blog.natuie.net/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="数据恢复" scheme="https://blog.natuie.net/tags/%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D/"/>
    
  </entry>
  
  <entry>
    <title>Rust使用蒙特卡洛方法估算圆周率</title>
    <link href="https://blog.natuie.net/posts/2024/02/03/094855/"/>
    <id>https://blog.natuie.net/posts/2024/02/03/094855/</id>
    <published>2024-02-03T01:48:55.000Z</published>
    <updated>2025-08-16T15:24:59.574Z</updated>
    
    <content type="html"><![CDATA[<h2 id="使用Rust和蒙特卡洛方法估算圆周率"><a href="#使用Rust和蒙特卡洛方法估算圆周率" class="headerlink" title="使用Rust和蒙特卡洛方法估算圆周率"></a>使用Rust和蒙特卡洛方法估算圆周率</h2><h3 id="蒙特卡洛方法简介"><a href="#蒙特卡洛方法简介" class="headerlink" title="蒙特卡洛方法简介"></a>蒙特卡洛方法简介</h3><p>蒙特卡洛方法是一种基于概率和随机抽样的算法，用于解决各种数学和物理问题。在估算圆周率的情况下，蒙特卡洛方法通过随机生成点并计算它们落在单位圆内的比例来工作。</p><h3 id="Rust编程语言"><a href="#Rust编程语言" class="headerlink" title="Rust编程语言"></a>Rust编程语言</h3><p>Rust是一种系统编程语言，它提供了对性能和安全的保证。Rust的内存安全特性使其成为编写高性能并发程序的理想选择。</p><h3 id="实现蒙特卡洛方法"><a href="#实现蒙特卡洛方法" class="headerlink" title="实现蒙特卡洛方法"></a>实现蒙特卡洛方法</h3><p>rayon是一个用于并行迭代和处理数据的Rust库，它可以帮助你轻松地将迭代任务分配到多个CPU核心上，从而加速计算。<br>首先，你需要在<strong>Cargo.toml</strong>中添加依赖：<strong>rayon</strong></p><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[dependencies]</span></span><br><span class="line"><span class="attr">rayon</span> = <span class="string">&quot;1.5.1&quot;</span></span><br></pre></td></tr></table></figure><p>然后，你可以使用的并行迭代功能来并行化圆周率的计算。以下是一个示例代码：</p><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> rayon::prelude::*;</span><br><span class="line"><span class="keyword">use</span> std::time::Instant;</span><br><span class="line"></span><br><span class="line"><span class="keyword">fn</span> <span class="title function_">main</span>() &#123;</span><br><span class="line">    <span class="keyword">let</span> <span class="variable">now</span> = Instant::<span class="title function_ invoke__">now</span>();</span><br><span class="line">    <span class="keyword">let</span> <span class="variable">total_iterations</span>: <span class="type">usize</span> = <span class="number">1_000_000_000</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="variable">inside_circle</span>: <span class="type">usize</span> = (<span class="number">0</span>..total_iterations)</span><br><span class="line">        .<span class="title function_ invoke__">into_par_iter</span>()</span><br><span class="line">        .<span class="title function_ invoke__">filter</span>(|_| &#123;</span><br><span class="line">            <span class="keyword">let</span> <span class="variable">x</span>: <span class="type">f64</span> = rand::<span class="title function_ invoke__">random</span>();</span><br><span class="line">            <span class="keyword">let</span> <span class="variable">y</span>: <span class="type">f64</span> = rand::<span class="title function_ invoke__">random</span>();</span><br><span class="line">            x * x + y * y &lt;= <span class="number">1.0</span></span><br><span class="line">        &#125;)</span><br><span class="line">        .<span class="title function_ invoke__">count</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="variable">pi_estimate</span> = (inside_circle <span class="keyword">as</span> <span class="type">f64</span> / total_iterations <span class="keyword">as</span> <span class="type">f64</span>) * <span class="number">4.0</span>;</span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;Estimated value of Pi: &#123;&#125;&quot;</span>, pi_estimate);</span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;Time taken: &#123;:.2?&#125;&quot;</span>, now.<span class="title function_ invoke__">elapsed</span>());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="代码解释"><a href="#代码解释" class="headerlink" title="代码解释"></a>代码解释</h3><ul><li>导入必要的库：rayon用于并行计算。</li><li>使用Instant::now()获取当前时间，用于计算程序运行时间。</li><li>设置总迭代次数为1亿次。</li><li>使用rayon的并行迭代功能来加速计算。</li><li>在每个迭代中，生成一对随机数（x和y），并检查它们是否落在单位圆内。</li><li>计算落在圆内的点的数量。</li><li>根据落在圆内的点的比例估算圆周率。</li><li>输出估算的圆周率值和程序运行时间。</li></ul>]]></content>
    
    
    <summary type="html">圆周率（π）是数学和物理学中一个非常重要的常数，它表示圆的周长与其直径的比例。圆周率是一个无理数，意味着它不能表示为两个整数的比例，其小数部分是无限不循环的。在计算机科学中，估算圆周率的方法有很多种，其中一种流行的方法是蒙特卡洛方法。</summary>
    
    
    
    <category term="Rust" scheme="https://blog.natuie.net/categories/Rust/"/>
    
    
    <category term="算法" scheme="https://blog.natuie.net/tags/%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>Node.js 用Socket从零开始编写一个Chat-Cli</title>
    <link href="https://blog.natuie.net/posts/2024/01/31/232442/"/>
    <id>https://blog.natuie.net/posts/2024/01/31/232442/</id>
    <published>2024-01-31T15:24:42.000Z</published>
    <updated>2025-08-16T15:24:59.574Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Socket"><a href="#Socket" class="headerlink" title="Socket"></a>Socket</h3><p>一种独立于协议的网络编程接口，所谓套接字(Socket)，就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端，提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲，套接字上联应用进程，下联网络协议栈，是应用程序通过网络协议进行通信的接口，是应用程序与网络协议栈进行交互的接口。</p><h3 id="Socket主要类型"><a href="#Socket主要类型" class="headerlink" title="Socket主要类型"></a>Socket主要类型</h3><p>流套接字(SOCK_STREAM)<br>流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送，并按顺序接收。流套接字之所以能够实现可靠的数据服务，原因在于其使用了传输控制协议，即TCP(The Transmission Control Protocol)协议。<br>数据报套接字(SOCK_DGRAM)<br>数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复，且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性，对于有可能出现的数据丢失情况，需要在程序中做相应的处理 。<br>原始套接字(SOCK_RAW)<br>原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于：原始套接字可以读写内核没有处理的IP数据包，而流套接字只能读取TCP协议的数据，数据报套接字只能读取UDP协议的数据。因此，如果要访问其他协议发送的数据必须使用原始套接。</p><h3 id="Socket主要流程"><a href="#Socket主要流程" class="headerlink" title="Socket主要流程"></a>Socket主要流程</h3><p>要通过互联网进行通信，至少需要一对套接字，其中一个运行于客户端，我们称之为 Client Socket，另一个运行于服务器端，我们称之为 Server Socket。</p><p>根据连接启动的方式以及本地套接字要连接的目标，套接字之间的连接过程可以分为三个步骤：<br>(1)服务器监听。<br>(2)客户端请求。<br>(3)连接确认 。</p><p>1.服务器监听<br>所谓服务器监听，是指服务器端套接字并不定位具体的客户端套接字，而是处于等待连接的状态，实时监控网络状态。</p><p>2.客户端请求<br>所谓客户端请求，是指由客户端的套接字提出连接请求，要连接的目标是服务器端的套接字。为此，客户端的套接字必须首先描述它要连接的服务器的套接字，指出服务器端套接字的地址和端口号，然后就向服务器端接字提出连接请求。</p><p>3.连接确认<br>所谓连接确认，是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求，就会响应客户端套接字的请求，建立一个新的线程，并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述，连接就建立好了。而服务器端套接字继续处于监听状态，接收其他客户端套接字的连接请求。</p><h3 id="Socket主要特点"><a href="#Socket主要特点" class="headerlink" title="Socket主要特点"></a>Socket主要特点</h3><p>根据套接字的不同类型，可以将套接字调用分为面向连接服务和无连接服务。</p><p>面向连接服务的主要特点如下：<br>(1)数据传输过程必须经过建立连接、维护连接和释放连接3个阶段 ；<br>(2)在传输过程中，各分组不需要携带目的主机的地址；<br>(3)可靠性好，但由于协议复杂，通信效率不高 。</p><p>面向无连接服务的主要特点如下：<br>(1)不需要连接的各个阶段 ；<br>(2)每个分组都携带完整的目的主机地址，在系统中独立传送 ；<br>(3)由于没有顺序控制，所以接收方的分组可能出现乱序、重复和丢失现象 ；<br>(4)通信效率高，但可靠性不能确保。</p><h3 id="Socket的引入"><a href="#Socket的引入" class="headerlink" title="Socket的引入"></a>Socket的引入</h3><p>为了更方便地开发网络应用程序，美国伯克利大学在UNIX上推出了一种应用程序访问通信协议的操作系统调用接字(Socket)。 Socket的出现，使得程序员可以很方便地访问 TCPIP，从而开发各种网络应用程序。后来套接字被引进到 Windows等操作系统，成为开发网络应用程序的有效工具。<br>套接字存在于通信区域，通信区域也被称为地址族，主要用于将通过套接字通信的进程的公有特性综合在一起。套接字通常只与同一区域的套接字交换数据。Windows Socket只支持一个通信区域——AF_INET国际网区域，使用网际协议族通信的进程使用该域。</p><h3 id="Http与Socket的区别"><a href="#Http与Socket的区别" class="headerlink" title="Http与Socket的区别"></a>Http与Socket的区别</h3><p>在以前我们实现数据交换已经有了HTTP协议,为什么还要学习Socket？<br>回顾当输出 <a href="http://www.baidu.com/">www.baidu.com</a> 的时候浏览器执行了那些操作？</p><h4 id="http通信的特点："><a href="#http通信的特点：" class="headerlink" title="http通信的特点："></a>http通信的特点：</h4><p>连接属于非持久性连接:TCP的三次握手<br>客户端只能访问服务端，服务端无法访问客户端，属于单项通信<br>TCP三次握手：<br>TCP三次握手过程中不传递数据,只为同步连接双方的序列号和确认号传递数据，在握手后服务端和客户端才开始传输数据，在理想状态下，TCP连接一旦建立，在通信的双方中任何一方主动断开连接之前TCP连接会一直保持下去。</p><h4 id="Socket通信特点"><a href="#Socket通信特点" class="headerlink" title="Socket通信特点:"></a>Socket通信特点:</h4><p>1、持久性连接<br>2、双向通信，客户端能访问服务端，服务端也能访问客户端</p><p>Socket是对TCP&#x2F;IP协议的封装，Socket只是一个接口而不是一个协议，通过Socket我们才能使用TCP&#x2F;IP&#x2F;UDP协议。</p><h3 id="Socket原理"><a href="#Socket原理" class="headerlink" title="Socket原理"></a>Socket原理</h3><p><img src="/img/post/socket_principle.png" alt="Socket原理"></p><p>开始写一个简单的Socket</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//server.js</span></span><br><span class="line"><span class="comment">//服务器端</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 加载net模块</span></span><br><span class="line"><span class="keyword">var</span> net = require(<span class="string">&quot;net&quot;</span>)</span><br><span class="line"><span class="comment">// 创建net实例对象</span></span><br><span class="line"><span class="keyword">var</span> server = net.createServer();</span><br><span class="line"></span><br><span class="line">server.on(<span class="string">&quot;connection&quot;</span>,<span class="keyword">function</span>(<span class="params">client</span>)&#123;</span><br><span class="line">     client.on(<span class="string">&quot;data&quot;</span>,<span class="keyword">function</span>(<span class="params">data</span>)&#123;</span><br><span class="line">          <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&quot;客户端发来：&quot;</span>+data)</span><br><span class="line">          <span class="comment">// 向客户端发送信息</span></span><br><span class="line">          client.write(<span class="string">&quot;测试&quot;</span>);</span><br><span class="line">     &#125;)</span><br><span class="line"></span><br><span class="line">     <span class="comment">// Socket客户端关闭</span></span><br><span class="line">     client.on(<span class="string">&#x27;close&#x27;</span>, <span class="keyword">function</span> (<span class="params">err</span>) &#123;</span><br><span class="line">         <span class="built_in">console</span>.<span class="built_in">log</span>(client.remotePort + <span class="string">&#x27;退出了聊天室&#x27;</span>);</span><br><span class="line">     &#125;</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 建立监听</span></span><br><span class="line">server.listen(<span class="number">3000</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;Starting Socket server...&#x27;</span>);</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;http://127.0.0.1:3000&#x27;</span>);</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;&#x27;</span>);</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 服务器异常</span></span><br><span class="line">server.on(<span class="string">&#x27;error&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;Server error&#x27;</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">client.js</span><br><span class="line"></span><br><span class="line"><span class="comment">//客户端</span></span><br><span class="line"><span class="keyword">var</span> net= require(<span class="string">&quot;net&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建连接</span></span><br><span class="line"><span class="keyword">var</span> socket = net.createConnection(&#123;</span><br><span class="line">    <span class="attr">host</span>: <span class="string">&#x27;127.0.0.1&#x27;</span>,</span><br><span class="line">    <span class="attr">port</span>: <span class="number">3000</span></span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">socket.on(<span class="string">&#x27;connect&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">// 一直读取输入</span></span><br><span class="line">    process.stdin.on(<span class="string">&#x27;data&#x27;</span>, <span class="keyword">function</span> (<span class="params">msg</span>) &#123;</span><br><span class="line">        socket.write(msg.toString();</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 接收服务器端发来的数据</span></span><br><span class="line">socket.on(<span class="string">&quot;data&quot;</span>,<span class="keyword">function</span>(<span class="params">data</span>)&#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&quot;服务器发来：&quot;</span>+data)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>这是一个简单实例，也很好理解。</p><h3 id="编写Chat-Cli"><a href="#编写Chat-Cli" class="headerlink" title="编写Chat-Cli"></a>编写Chat-Cli</h3><p>Chat-cli就是在命令行上聊天都一种方式，为什么要在命令行上聊天呢？因为这样的程序占用较小，可以边敲命令边聊天，这看起来是不是很不错？接下来我们将深入的编写Chat-cli，我将我编写的命名为NChat-Cli。<br>实现原理归根结底就是将所有加入的用户存在一个数组里面。<br>那放数组里面怎么知道那个是谁呢？我们可以用内置的一个函数Socket.remotePort获取对应的id，可以将名字加id结合起来找到对应用户，一个用户实质就是一个Socket，如果要实现私聊，可以将这些信息存储至数组里面，比如{username: username, id: id, socket: socket}，通过id查找用户(Socket)<br>如何实现多房间聊天呢？<br>这个实现也很简单，还是吧用户存储在数组里面，可以创建一个二维数组Array[HomeID][UserSocket],也可以存储用户信息，可以这样Array[HomeID]{username: username, id: id, socket: socket}，当用户向房间发送信息时，遍历这个房间所有用户，向遍历出来的用户逐一发送，除自己外。<br>上面提到的一些变量意思为： username：用户名，id：用户id，Socket和UserSocket：就是一个用户，HomeID：房间号。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm init <span class="comment"># 初始化一个项目</span></span><br><span class="line">npm install moment --save <span class="comment"># 安装时间工具</span></span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//server.js</span></span><br><span class="line"><span class="comment">// 加载net模块</span></span><br><span class="line"><span class="keyword">const</span> net = <span class="built_in">require</span>(<span class="string">&quot;net&quot;</span>);</span><br><span class="line"><span class="comment">// 加载时间模块</span></span><br><span class="line"><span class="keyword">var</span> moment = <span class="built_in">require</span>(<span class="string">&#x27;moment&#x27;</span>);</span><br><span class="line"><span class="comment">// 创建net实例对象</span></span><br><span class="line"><span class="keyword">var</span> server = net.<span class="title function_">createServer</span>();</span><br><span class="line"><span class="comment">// 保存所有客户的socket对象</span></span><br><span class="line"><span class="keyword">var</span> users = [];</span><br><span class="line"><span class="comment">// 保存所有房间ID</span></span><br><span class="line"><span class="keyword">var</span> homeIDs = <span class="title class_">Array</span>();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 计算数组总数,不计空数组</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">count_array_num</span>(<span class="params">array</span>)&#123;</span><br><span class="line">    <span class="keyword">var</span> num = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; array.<span class="property">length</span>; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(array[i] != <span class="literal">undefined</span> || array[i] != <span class="literal">null</span>)&#123;</span><br><span class="line">            num++;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> num;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 建立监听</span></span><br><span class="line">server.<span class="title function_">listen</span>(<span class="number">3000</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;Starting NChat server...&#x27;</span>);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;http://127.0.0.1:3000&#x27;</span>);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;&#x27;</span>);</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">server.<span class="title function_">on</span>(<span class="string">&#x27;connection&#x27;</span>, <span class="keyword">function</span> (<span class="params">socket</span>) &#123;</span><br><span class="line">    <span class="comment">// 客户端发送的数据</span></span><br><span class="line">    <span class="keyword">var</span> client_data;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 将加入聊天室的用户加入至数组</span></span><br><span class="line">    users.<span class="title function_">push</span>(socket); </span><br><span class="line"></span><br><span class="line">    socket.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="keyword">function</span> (<span class="params">data</span>) &#123;   </span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(data.<span class="title function_">toString</span>());</span><br><span class="line">        client_data = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(data);</span><br><span class="line">        </span><br><span class="line">        <span class="comment">// 房间用户初始化</span></span><br><span class="line">        <span class="keyword">if</span>(homeIDs[client_data.<span class="property">homeID</span>] == <span class="literal">undefined</span>)&#123;</span><br><span class="line">            homeIDs[client_data.<span class="property">homeID</span>] = <span class="title class_">Array</span>();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 昵称为空判断</span></span><br><span class="line">        <span class="keyword">if</span>(client_data.<span class="property">username</span> == <span class="literal">null</span>)&#123;</span><br><span class="line">            <span class="comment">//为空则初始化昵称</span></span><br><span class="line">            client_data.<span class="property">username</span> = <span class="string">&quot;User&quot;</span> + socket.<span class="property">remotePort</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 加入房间</span></span><br><span class="line">        <span class="keyword">var</span> isExist = <span class="number">0</span>; <span class="comment">// o: false , 1: true</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; homeIDs[client_data.<span class="property">homeID</span>].<span class="property">length</span>; i++)&#123;</span><br><span class="line">            <span class="comment">// 用户加入判断</span></span><br><span class="line">            <span class="keyword">if</span>(homeIDs[client_data.<span class="property">homeID</span>][i] != <span class="literal">undefined</span> &amp;&amp; homeIDs[client_data.<span class="property">homeID</span>][i].<span class="property">remotePort</span> == socket.<span class="property">remotePort</span>)&#123;</span><br><span class="line">                isExist = <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 如果用户没有加入房间则加入</span></span><br><span class="line">        <span class="keyword">if</span> (isExist == <span class="number">0</span>) &#123;</span><br><span class="line">            homeIDs[client_data.<span class="property">homeID</span>].<span class="title function_">push</span>(socket);</span><br><span class="line">            <span class="keyword">var</span> time = <span class="title function_">moment</span>(<span class="title class_">Date</span>.<span class="title function_">now</span>()).<span class="title function_">format</span>(<span class="string">&#x27;YYYY-MM-DD HH:mm:ss&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(time + <span class="string">&#x27; &#x27;</span> + client_data.<span class="property">username</span> + <span class="string">&#x27;(&#x27;</span> + socket.<span class="property">remotePort</span> + <span class="string">&#x27;)&#x27;</span> + <span class="string">&#x27; Join &#x27;</span> + client_data.<span class="property">homeID</span> + <span class="string">&#x27; home(Online num: &#x27;</span> + <span class="title function_">count_array_num</span>(homeIDs[client_data.<span class="property">homeID</span>]) + <span class="string">&#x27;)&#x27;</span>);</span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">var</span> j = <span class="number">0</span>; j &lt; homeIDs[client_data.<span class="property">homeID</span>].<span class="property">length</span>; j++)&#123;</span><br><span class="line">                <span class="keyword">if</span>(homeIDs[client_data.<span class="property">homeID</span>][j] != <span class="literal">undefined</span> &amp;&amp; homeIDs[client_data.<span class="property">homeID</span>][j] != socket)&#123;</span><br><span class="line">                    homeIDs[client_data.<span class="property">homeID</span>][j].<span class="title function_">write</span>(time + <span class="string">&#x27; &#x27;</span> + client_data.<span class="property">username</span> + <span class="string">&#x27;(&#x27;</span> + socket.<span class="property">remotePort</span> + <span class="string">&#x27;)&#x27;</span> + <span class="string">&#x27;加入了 &#x27;</span> + client_data.<span class="property">homeID</span> + <span class="string">&#x27; 房间(在线人数: &#x27;</span> + <span class="title function_">count_array_num</span>(homeIDs[client_data.<span class="property">homeID</span>]) + <span class="string">&#x27;)&#x27;</span>);</span><br><span class="line">                    </span><br><span class="line">                &#125; <span class="keyword">else</span> <span class="keyword">if</span>(homeIDs[client_data.<span class="property">homeID</span>][j] != <span class="literal">undefined</span>)&#123;</span><br><span class="line">                    socket.<span class="title function_">write</span>(<span class="string">&#x27;加入 &#x27;</span> + client_data.<span class="property">homeID</span> + <span class="string">&#x27; 房间成功! 在线人数: &#x27;</span> + <span class="title function_">count_array_num</span>(homeIDs[client_data.<span class="property">homeID</span>]) + <span class="string">&#x27;)\n&#x27;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 发送信息</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">var</span> k = <span class="number">0</span>; k &lt; homeIDs[client_data.<span class="property">homeID</span>].<span class="property">length</span>; k++)&#123;</span><br><span class="line">            <span class="keyword">if</span>(homeIDs[client_data.<span class="property">homeID</span>][k] != <span class="literal">undefined</span> &amp;&amp; client_data.<span class="property">message</span> != <span class="literal">undefined</span> &amp;&amp; homeIDs[client_data.<span class="property">homeID</span>][k] != socket)&#123;</span><br><span class="line">                <span class="keyword">var</span> time = <span class="title function_">moment</span>(<span class="title class_">Date</span>.<span class="title function_">now</span>()).<span class="title function_">format</span>(<span class="string">&#x27;YYYY-MM-DD HH:mm:ss&#x27;</span>);</span><br><span class="line">                homeIDs[client_data.<span class="property">homeID</span>][k].<span class="title function_">write</span>(time + <span class="string">&#x27;\n&#x27;</span> + client_data.<span class="property">username</span> + <span class="string">&#x27;: &#x27;</span> + client_data.<span class="property">message</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 用户退出调用</span></span><br><span class="line">    socket.<span class="title function_">on</span>(<span class="string">&#x27;close&#x27;</span>, <span class="keyword">function</span> (<span class="params">err</span>) &#123;</span><br><span class="line">        <span class="keyword">var</span> time = <span class="title function_">moment</span>(<span class="title class_">Date</span>.<span class="title function_">now</span>()).<span class="title function_">format</span>(<span class="string">&#x27;YYYY-MM-DD HH:mm:ss&#x27;</span>);</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(time + <span class="string">&#x27; &#x27;</span> + client_data.<span class="property">username</span> + <span class="string">&#x27;(&#x27;</span> + socket.<span class="property">remotePort</span> + <span class="string">&#x27;)&#x27;</span> + <span class="string">&#x27; Exit &#x27;</span> + client_data.<span class="property">homeID</span> + <span class="string">&#x27; home(Online num: &#x27;</span> + <span class="title function_">count_array_num</span>(homeIDs[client_data.<span class="property">homeID</span>]) + <span class="string">&#x27;)&#x27;</span>);</span><br><span class="line">        <span class="comment">// 删除房间里面的退出去的用户</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">var</span> j = <span class="number">0</span>; j &lt; homeIDs[client_data.<span class="property">homeID</span>].<span class="property">length</span>; j++)&#123;</span><br><span class="line">            <span class="keyword">if</span>(homeIDs[client_data.<span class="property">homeID</span>][j] == socket)&#123;</span><br><span class="line">                <span class="keyword">delete</span> homeIDs[client_data.<span class="property">homeID</span>][j];</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span>(homeIDs[client_data.<span class="property">homeID</span>][j] != <span class="literal">undefined</span>)&#123;</span><br><span class="line">                <span class="comment">// 输出退出信息,不输出给退出的用户</span></span><br><span class="line">                homeIDs[client_data.<span class="property">homeID</span>][j].<span class="title function_">write</span>(time + <span class="string">&#x27; &#x27;</span> + client_data.<span class="property">username</span> + <span class="string">&#x27;(&#x27;</span> + socket.<span class="property">remotePort</span> + <span class="string">&#x27;)&#x27;</span> + <span class="string">&#x27; 退出了 &#x27;</span> + client_data.<span class="property">homeID</span> + <span class="string">&#x27; 房间(在线人数: &#x27;</span> + <span class="title function_">count_array_num</span>(homeIDs[client_data.<span class="property">homeID</span>]) + <span class="string">&#x27;)\n&#x27;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        users.<span class="title function_">forEach</span>(<span class="keyword">function</span> (<span class="params">uesr</span>) &#123;</span><br><span class="line">            <span class="comment">// 删除退出去的总用户</span></span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">var</span> k = <span class="number">0</span>; k &lt; users.<span class="property">length</span>; k++)&#123;</span><br><span class="line">                <span class="keyword">if</span>( users[k] == socket)&#123;</span><br><span class="line">                    <span class="keyword">delete</span> users[k];</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 服务器异常</span></span><br><span class="line">server.<span class="title function_">on</span>(<span class="string">&#x27;error&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;Server error&#x27;</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// client.js</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//导入net</span></span><br><span class="line"><span class="keyword">var</span> net = <span class="built_in">require</span>(<span class="string">&#x27;net&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//发送数据的实体</span></span><br><span class="line"><span class="keyword">var</span> data = &#123;</span><br><span class="line">    <span class="attr">username</span>: <span class="literal">null</span>,</span><br><span class="line">    <span class="attr">homeID</span>: <span class="literal">null</span>,</span><br><span class="line">    <span class="attr">message</span>: <span class="literal">undefined</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//处理参数</span></span><br><span class="line"><span class="keyword">const</span> argv = process.<span class="property">argv</span>.<span class="title function_">slice</span>(<span class="number">2</span>);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; argv.<span class="property">length</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">switch</span>(argv[i])&#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;-n&#x27;</span>:</span><br><span class="line">            data.<span class="property">username</span> = argv[i +<span class="number">1</span>];</span><br><span class="line">            i++;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;-id&#x27;</span>:</span><br><span class="line">            data.<span class="property">homeID</span> = argv[i +<span class="number">1</span>];</span><br><span class="line">            i++;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;-c&#x27;</span>:</span><br><span class="line">            content = argv[i +<span class="number">1</span>];</span><br><span class="line">            i++;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;-v&#x27;</span>:</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;NChat Version: 1.0 bate&#x27;</span>);</span><br><span class="line">            process.<span class="title function_">exit</span>(<span class="number">0</span>);</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;--help&#x27;</span>:</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;Usage: nchat [options]&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;Options:&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;  -n      add username&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;  -id      add homeid&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;  -c      send content&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;  -v      get version&#x27;</span>);</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;  --help    help&#x27;</span>);</span><br><span class="line">            process.<span class="title function_">exit</span>(<span class="number">0</span>);</span><br><span class="line">        <span class="attr">default</span>:</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Unknown parameter&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建连接</span></span><br><span class="line"><span class="keyword">var</span> socket = net.<span class="title function_">createConnection</span>(&#123;</span><br><span class="line">    <span class="attr">host</span>: <span class="string">&#x27;127.0.0.1&#x27;</span>,</span><br><span class="line">    <span class="attr">port</span>: <span class="number">3000</span></span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输入消息</span></span><br><span class="line">socket.<span class="title function_">on</span>(<span class="string">&#x27;connect&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">// 待发送内容</span></span><br><span class="line">    <span class="keyword">var</span> content;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//提前告诉服务端个人信息</span></span><br><span class="line">    socket.<span class="title function_">write</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data));</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span>(content != <span class="literal">null</span>)&#123;</span><br><span class="line">        data.<span class="property">message</span> = content;</span><br><span class="line">        socket.<span class="title function_">write</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data));</span><br><span class="line">        process.<span class="title function_">exit</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//读取要发送给用户的内容</span></span><br><span class="line">    process.<span class="property">stdin</span>.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="keyword">function</span> (<span class="params">msg</span>) &#123;</span><br><span class="line">        process.<span class="property">stdout</span>.<span class="title function_">write</span>(<span class="string">&#x27;\n&#x27;</span>);</span><br><span class="line">        data.<span class="property">message</span> = msg.<span class="title function_">toString</span>().<span class="title function_">slice</span>(<span class="number">0</span>, -<span class="number">1</span>);</span><br><span class="line">        socket.<span class="title function_">write</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data));</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">//接收消息</span></span><br><span class="line">socket.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="keyword">function</span> (<span class="params">data</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(data.<span class="title function_">toString</span>() + <span class="string">&#x27;\n&#x27;</span>);</span><br><span class="line">&#125;);</span><br><span class="line"><span class="comment">//服务器异常</span></span><br><span class="line">socket.<span class="title function_">on</span>(<span class="string">&#x27;error&#x27;</span>, <span class="keyword">function</span> (<span class="params">err</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;Server error&#x27;</span>);</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h4 id="编译运行"><a href="#编译运行" class="headerlink" title="编译运行"></a>编译运行</h4><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm run <span class="literal">start</span></span><br><span class="line"><span class="keyword">node</span> <span class="title">client</span>.js -n 昵称 -n 房间号</span><br></pre></td></tr></table></figure><blockquote><p>然后就可以在命令行上面聊天啦！<br>开源地址 <a href="https://github.com/natuie/NChat">Github</a></p></blockquote>]]></content>
    
    
    <summary type="html">Socket一种独立于协议的网络编程接口，所谓套接字(Socket)，就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端，提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲，套接字上联应用进程，下联网络协议栈，是应用程序通过网络协议进行通信的接口，是应用程序与网络协议栈进行交互的接口。</summary>
    
    
    
    <category term="Node.js" scheme="https://blog.natuie.net/categories/Node-js/"/>
    
    
    <category term="及时通讯" scheme="https://blog.natuie.net/tags/%E5%8F%8A%E6%97%B6%E9%80%9A%E8%AE%AF/"/>
    
    <category term="Socket" scheme="https://blog.natuie.net/tags/Socket/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://blog.natuie.net/posts/2024/01/30/000000/"/>
    <id>https://blog.natuie.net/posts/2024/01/30/000000/</id>
    <published>2024-01-29T16:00:00.000Z</published>
    <updated>2025-08-16T15:24:59.576Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
    <summary type="html">Welcome to Hexo This is your very first post. Check documentation(https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting(https://hexo.io/docs/troubleshooting.html) or you can ask me on GitHub(https://github.com/hexojs/hexo/issues).</summary>
    
    
    
    
  </entry>
  
</feed>
