<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alan &#8211; Simon</title>
	<atom:link href="https://www.luisimon.com/author/alan/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.luisimon.com</link>
	<description>blog</description>
	<lastBuildDate>Sun, 22 Jun 2025 11:52:10 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>

<image>
	<url>https://www.luisimon.com/wp-content/uploads/2019/09/cbrks-x5t4i-001.ico</url>
	<title>Alan &#8211; Simon</title>
	<link>https://www.luisimon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Ubuntu 24 强制设置root用户为简单密码</title>
		<link>https://www.luisimon.com/2025/06/22/949/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 11:52:09 +0000</pubDate>
				<category><![CDATA[Linux日记]]></category>
		<category><![CDATA[随手记录]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=949</guid>

					<description><![CDATA[以下脚本由ChatGPT生成，只要修改[NEW_PASSWORD]变量即可修改root用户密码为任意值。 使用 ... <a title="Ubuntu 24 强制设置root用户为简单密码" class="read-more" href="https://www.luisimon.com/2025/06/22/949/" aria-label="继续阅读Ubuntu 24 强制设置root用户为简单密码">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>以下脚本由ChatGPT生成，只要修改[<strong>NEW_PASSWORD</strong>]变量即可修改root用户密码为任意值。</p>



<p></p>



<pre class="wp-block-code"><code>

#!/bin/bash

# 你想设置的密码
NEW_PASSWORD="111111"

# 检查是否为 root 运行
if &#91;&#91; "$EUID" -ne 0 ]]; then
  echo "请以 root 身份运行本脚本（sudo）"
  exit 1
fi

# 确保 root 用户未被锁定
passwd -S root | grep -q 'L' &amp;&amp; {
  echo "解锁 root 用户..."
  passwd -u root
}

# 设置 root 密码（绕过复杂度检查）
echo "root:$NEW_PASSWORD" | chpasswd &amp;&amp; {
  echo "✅ 成功将 root 密码设置为 '$NEW_PASSWORD'"
} || {
  echo "❌ 设置密码失败"
  exit 1
}
</code></pre>



<p>使用比如vim编辑器新建一个脚本文件。</p>



<p>如果没有vim，请执行以下安装命令</p>



<pre class="wp-block-code"><code>#系统中无vim时执行
apt install vim</code></pre>



<pre class="wp-block-code"><code>vim set-root-simple-password.sh
# 然后按键盘上&#91;Insert]按键或者&#91;i]按键
# Shift + Insert，粘贴上面的脚本
# 按&#91;Esc]推出输入状态，在按&#91;:]冒号（注意是英文符号），终端窗口左下角会显示冒号，然后输入wq，回车即可保存。
# 下面命令给予脚本执行权限，并且执行脚本
chmod +a set-root-simple-password.sh &amp; ./set-root-simple-password.sh</code></pre>



<p><strong>注意Ubuntu桌面不允许使用root登录，所以切换到root登录时，无论如何都提示密码错误！</strong></p>



<p>允许root登录桌面另有办法，请自行AI。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>N型MOSFET电荷泵驱动电路</title>
		<link>https://www.luisimon.com/2024/11/09/923/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Sat, 09 Nov 2024 15:03:14 +0000</pubDate>
				<category><![CDATA[电子电路]]></category>
		<category><![CDATA[MOSFETT]]></category>
		<category><![CDATA[T12]]></category>
		<category><![CDATA[电荷泵]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=923</guid>

					<description><![CDATA[前言：众所周知，MOSFET为“电压驱动”型器件，以N-MOS为例，VGS电压与RDS(on)成反比。即驱动N ... <a title="N型MOSFET电荷泵驱动电路" class="read-more" href="https://www.luisimon.com/2024/11/09/923/" aria-label="继续阅读N型MOSFET电荷泵驱动电路">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p><strong>前言：众所周知，MOSFET为“电压驱动”型器件，以N-MOS为例，V<sub>GS</sub>电压与R<sub>DS(on)</sub>成反比。即驱动N-MOS时<strong>V<sub>GS</sub></strong>尽可能最大。</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="534" height="287" src="https://www.luisimon.com/wp-content/uploads/2024/10/ChargePump.jpg" alt="" class="wp-image-925" srcset="https://www.luisimon.com/wp-content/uploads/2024/10/ChargePump.jpg 534w, https://www.luisimon.com/wp-content/uploads/2024/10/ChargePump-300x161.jpg 300w" sizes="(max-width: 534px) 100vw, 534px" /><figcaption class="wp-element-caption">N-MOSFET &amp; Charge Pump（测试电路，电阻R13不是必须的）</figcaption></figure></div>


<p>首先讲清楚此电路的具体是用于控制T12烙铁，其中P+是接T12烙铁正极。</p>



<p>电荷泵组成器件分别是：D2、D3、C4，此三个器件构成的电荷泵可以使N沟道的MOS作为上管使用。</p>



<p>即是Q2导通，MOS关断时，电源通过D3、C4以及烙铁构成回路并在此时为C4充电至电源电压。在Q2关断时，MOS导通，由于MOS导通后电阻极小（T12烙铁≈8Ω），使得B点电压迅速抬升（接近电源电压），C4在此时发挥作用，由于C4负极在B点，C4电压满足MOS的V<sub>GS</sub>最小要求，向G极提供电流，MOS稳定导通。</p>



<p>解释：D3的作用使防止MOS导通时，C4通过MOS流回B点而放电。D2主要起到钳位作用保护MOS的G极（V<sub>GS</sub>最高耐压20V）。</p>



<p class="has-text-color has-link-color wp-elements-1a88632bc5a1b55ce5a7b6597637164a" style="color:#919ca5"><em>其他：A、B电压约为18V，A对地电压约为 电源电压+18V。</em></p>



<p><a href="https://www.luisimon.com/goto/litp" rel="nofollow" data-type="link" data-id="https://github.com/wagiminator/ATmega-Soldering-Station">T12项目参考自德国网友GitHub</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>奥克斯(AUX)风扇遥控器协议</title>
		<link>https://www.luisimon.com/2024/09/01/897/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Sun, 01 Sep 2024 06:04:26 +0000</pubDate>
				<category><![CDATA[单片机]]></category>
		<category><![CDATA[編程三兩事]]></category>
		<category><![CDATA[红外]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=897</guid>

					<description><![CDATA[分析可知，奥克斯遥控器应该是私有协议不同于NEC协议。 由逻辑分析仪图可以看出，每个位的信号周期由400us和 ... <a title="奥克斯(AUX)风扇遥控器协议" class="read-more" href="https://www.luisimon.com/2024/09/01/897/" aria-label="继续阅读奥克斯(AUX)风扇遥控器协议">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>分析可知，奥克斯遥控器应该是私有协议不同于NEC协议。</p>



<p>由逻辑分析仪图可以看出，每个位的信号周期由400us和1200us组成。根据抓取到遥控器所有按键信号数据，分析前面4bit是固定的，后8bit可以理解位数据。注意：由于此协议无固定结束信号，所以最后1bit在分析仪上看并不完整，只需要判断低电平时长即可。</p>



<p>命令需要发送至少2次，每次间隔8ms。</p>



<p>笔者定义：</p>



<ul class="wp-block-list">
<li>1.2ms载波（低电平）+400us空闲（高电平）为“1”。</li>
</ul>



<ul class="wp-block-list">
<li>400us载波（低电平）+1.2ms空闲（高电平）为“0”。</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="197" src="https://www.luisimon.com/wp-content/uploads/2024/09/AUX分析-1024x197.jpg" alt="" class="wp-image-899" srcset="https://www.luisimon.com/wp-content/uploads/2024/09/AUX分析-1024x197.jpg 1024w, https://www.luisimon.com/wp-content/uploads/2024/09/AUX分析-300x58.jpg 300w, https://www.luisimon.com/wp-content/uploads/2024/09/AUX分析-768x148.jpg 768w, https://www.luisimon.com/wp-content/uploads/2024/09/AUX分析.jpg 1162w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>使用Shadowsocks+v2aryPlug+CDN搭建代理服务器，Cloudflare复活梯子</title>
		<link>https://www.luisimon.com/2024/06/30/835/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Sun, 30 Jun 2024 08:34:35 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[cdn]]></category>
		<category><![CDATA[cloudflare]]></category>
		<category><![CDATA[ss]]></category>
		<category><![CDATA[v2ary]]></category>
		<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=835</guid>

					<description><![CDATA[前言：翻墙（梯子）VPS被墙复活，隐藏自己的VPS，优化速度慢便宜VPS的线路速度。 前期准备工作： 1、域名 ... <a title="使用Shadowsocks+v2aryPlug+CDN搭建代理服务器，Cloudflare复活梯子" class="read-more" href="https://www.luisimon.com/2024/06/30/835/" aria-label="继续阅读使用Shadowsocks+v2aryPlug+CDN搭建代理服务器，Cloudflare复活梯子">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>前言：翻墙（梯子）VPS被墙复活，隐藏自己的VPS，优化速度慢便宜VPS的线路速度。</p>



<p><strong>前期准备工作：</strong></p>



<p>1、域名、海外虚拟主机（VPS 云主机）<em>注意：两者均需要花钱</em></p>



<p>2、准备账号：Cloudflare+海外vps销售商网站账号(用于购买)+godaddy(个人推荐)</p>



<p><strong>注意事项：</strong></p>



<p>域名：选购域名原则有三个。①不要在境内购买 ②不要选购cn这类需要备案的顶级域名 ③挑顶级域名购买即可。</p>



<p>VPS：对于主机，这里只提供选购建议。首先主要需要是海外的，这些地区访问互联网不受限制，通常建议购买机房在美国（美国对东半球光纤出口主要在洛杉矶），如果其他地区有线路优化，也可以选港、台、日以及新加坡等地区。这里要注意，别购买国内商家（例如：阿里云 腾讯云）的海外机房，相信不言自知。<em><strong>这里直接选美国机房即可。</strong></em></p>



<p><strong>看到这里，如果你有预算，想好了，就可以去把上面的所有东西准备好，再回来部署你的机器了</strong></p>



<p class="has-text-align-center"><strong>回见</strong></p>



<h2 class="wp-block-heading"><strong>域名配置与证书获取</strong></h2>



<p>流程简述：①我们先要登录CloudFlare，添加域名并获取CloudFlare的域名服务器地址 ②到购买的域名服务商那里把你的域名服务器地址改为刚刚从CloudFlare获得的地址 ③到CloudFlare获取SSL证书</p>



<p><strong>添加域名并获取CloudFlare域名服务器地址</strong></p>



<p>我们先登录你的CloudFlare账号，然后添加你刚刚购买的域名。添加成功后，单击你的域名，点选下方图①的“DNS”功能，这时你可以看到你的域名所有解析记录的一个列表，在列表的下方，找到图②的Cloudflare nameservers，把红框中的两个地址复制下来。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="121" src="https://www.luisimon.com/wp-content/uploads/2020/04/cficon-1024x121.jpg" alt="" class="wp-image-277" style="width:715px;height:84px" srcset="https://www.luisimon.com/wp-content/uploads/2020/04/cficon-1024x121.jpg 1024w, https://www.luisimon.com/wp-content/uploads/2020/04/cficon-300x35.jpg 300w, https://www.luisimon.com/wp-content/uploads/2020/04/cficon-768x91.jpg 768w, https://www.luisimon.com/wp-content/uploads/2020/04/cficon.jpg 1041w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">图① CloudFlare功能列表</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="285" src="https://www.luisimon.com/wp-content/uploads/2020/04/ns-1024x285.jpg" alt="" class="wp-image-279" srcset="https://www.luisimon.com/wp-content/uploads/2020/04/ns-1024x285.jpg 1024w, https://www.luisimon.com/wp-content/uploads/2020/04/ns-300x84.jpg 300w, https://www.luisimon.com/wp-content/uploads/2020/04/ns-768x214.jpg 768w, https://www.luisimon.com/wp-content/uploads/2020/04/ns.jpg 1031w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">图② CloudFlare域名服务器地址</figcaption></figure>



<p><strong>设置新域名服务器地址</strong></p>



<p>到刚刚购买域名的域名商的网站上，找到“DNS管理”，并且设置成上面CloudFlare的域名服务器地址，以使CloudFlare接管域名解析的权限。下面以godaddy为例：单击我们的账户名，点击“我的产品（My Product）”，这时会列出你账户下所有的域名，在你对应域名的后面，如图③，单击“DNS”，这是会看到这个域名的所有解析记录，在其下方即是“ 域名服务器 ”，单击更改，并填入CloudFlare的域名服务器地址保存即可。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="360" height="425" src="https://www.luisimon.com/wp-content/uploads/2020/04/微信截图_20200406222310.jpg" alt="" class="wp-image-280" srcset="https://www.luisimon.com/wp-content/uploads/2020/04/微信截图_20200406222310.jpg 360w, https://www.luisimon.com/wp-content/uploads/2020/04/微信截图_20200406222310-254x300.jpg 254w" sizes="auto, (max-width: 360px) 100vw, 360px" /><figcaption class="wp-element-caption">图③ 设置域名服务器</figcaption></figure></div>


<p><strong>获取CloudFlare的免费证书</strong></p>



<p>在获取证书之前，我们先来完成一下其他设置。先在“DNS”下，把图标点亮，启用对应记录的CDN加速，以及在“SSL/TLS”下设置加密模式为“Full”，如下两张图片</p>


<div class="wp-block-image is-resized">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="302" height="43" src="https://www.luisimon.com/wp-content/uploads/2020/04/无标题.jpg" alt="" class="wp-image-281" srcset="https://www.luisimon.com/wp-content/uploads/2020/04/无标题.jpg 302w, https://www.luisimon.com/wp-content/uploads/2020/04/无标题-300x43.jpg 300w" sizes="auto, (max-width: 302px) 100vw, 302px" /><figcaption class="wp-element-caption">图④ 启用CDN</figcaption></figure></div>

<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="669" src="https://www.luisimon.com/wp-content/uploads/2020/04/20200406222956-1024x669.jpg" alt="" class="wp-image-282" srcset="https://www.luisimon.com/wp-content/uploads/2020/04/20200406222956-1024x669.jpg 1024w, https://www.luisimon.com/wp-content/uploads/2020/04/20200406222956-300x196.jpg 300w, https://www.luisimon.com/wp-content/uploads/2020/04/20200406222956-768x502.jpg 768w, https://www.luisimon.com/wp-content/uploads/2020/04/20200406222956.jpg 1049w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> 图⑤ SSL/TLS模式 </figcaption></figure></div>


<p>完成以上，我们正式进行证书的生成，还是在“SSL/TLS”下，点击“Origin Server”，单击蓝色按钮进行证书的生成，在第一步我们只需把底部的有效期改为“1 year”即可（更改是为安全起见，不改亦可），下一步，这时我们可以看到CloudFlare给我生成证书的公钥和私钥了，我们把这“Origin Certificate（公钥）”和“Private Key（私钥）”两个文本框中的文本复制下来，并分别保存成“公钥.txt”和“私钥.txt”两个文件。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1022" height="434" src="https://www.luisimon.com/wp-content/uploads/2020/04/20200406223031.png" alt="" class="wp-image-287" srcset="https://www.luisimon.com/wp-content/uploads/2020/04/20200406223031.png 1022w, https://www.luisimon.com/wp-content/uploads/2020/04/20200406223031-300x127.png 300w, https://www.luisimon.com/wp-content/uploads/2020/04/20200406223031-768x326.png 768w" sizes="auto, (max-width: 1022px) 100vw, 1022px" /><figcaption class="wp-element-caption">图⑥ 证书生成</figcaption></figure>



<h2 class="wp-block-heading"><strong>VPS部署：</strong></h2>



<pre class="wp-block-verse"><em><strong>首先声明，以下所有创建和下载的文件我们都将存放在 “/root”目录下<br>查看当前所处目录命令：pwd<br>转到root目录命令：cd /root</strong></em></pre>



<p>机器最低硬件要求</p>



<ul class="wp-block-list">
<li>CPU：单核</li>



<li>内存：512 MB</li>



<li>硬盘：20GB</li>



<li>流量：300GB</li>
</ul>



<p>内存是必须保证的，否则你的代理服务容易被系统结束，导致频繁登录主机启动代理服务。</p>



<p>购买VPS时，在选好对应配置后，一般还会让你选择主机将要安装的操作系统以及机房位置（根据不同商家，有些可能在套餐中就指定了机房位置）。这里推荐安装CentOS7及以上版本的Linux，机房则是选择美国即可，优选洛杉矶。</p>



<p>在选购完成后，需要一小段时间等待系统初始化VPS。请在初始化完成后，在VPS管理界面获取root密码以及ip地址。具体如何获取，每个VPS商家的管理界面设计不同，请你细心寻找。</p>



<p><strong>登录VPS</strong></p>



<p>在拿到这些资料后，你需要准备一个SSH远程连接工具（<a rel="noreferrer noopener" aria-label="PuTTY（在新窗口打开）" href="https://www.luisimon.com/goto/1ei1" rel="nofollow" target="_blank">PuTTY</a>），当然如果你是Windows10用户，那你可以使用快捷键（Win+X）单击“Windows PowerShell”，打开后输入命令（注意需要英文字符）：ssh root@[你VPS的IP地址]，然后键入回车，接下来你需要输入“yes”，确认使用来自VPS的公钥。再然后输入刚才从管理界面获得root密码即可， 在Windows PowerShell中，鼠标右键为粘贴文本，注意这里输入密码是不会在显示任何东西出来，但是确实是输入了，输入完成后，键入回车即可，如果你的密码正确，此时就已经登录远程VPS了。<a rel="noreferrer noopener" aria-label="通过PuTTY登录VPS教程（在新窗口打开）" href="https://www.luisimon.com/goto/fi1p" rel="nofollow" target="_blank">通过PuTTY登录VPS教程</a></p>



<pre class="wp-block-code"><code>ssh root@192.168.1.111</code></pre>



<p><strong>检查VPS</strong></p>



<p>登录vps后，分别输入 “wget”，“ vim”，“tar”并回车，如果均没有出现类似“-bash: wget: command not found ”即可直接跳到<strong>服务程序安装</strong>。否则我们就要安装对应的功能。</p>



<p>wget 用于下载web上的文件，安装命令如下：</p>



<pre class="wp-block-code"><code>yum install wget -y</code></pre>



<p>vim 用于编辑文本 ，安装命令如下： </p>



<pre class="wp-block-code"><code>yum install vim -y</code></pre>



<p> tar 用于解压压缩包 ，安装命令如下： </p>



<pre class="wp-block-code"><code>yum install tar -y</code></pre>



<p><strong>下载代理服务程序</strong></p>



<p>shadowsocks：我们通过在GitHub上提供的<a rel="noreferrer noopener" aria-label="（在新窗口打开）" href="https://www.luisimon.com/goto/nf3e" rel="nofollow" target="_blank">一</a><a rel="noreferrer noopener" aria-label="键安装脚本（在新窗口打开）" href="https://www.luisimon.com/goto/85xd" rel="nofollow" target="_blank">键安装脚本</a>进行安装。 <a rel="noreferrer noopener" aria-label="项目地址（在新窗口打开）" href="https://www.luisimon.com/goto/nf3e" rel="nofollow" target="_blank">项目地址</a></p>



<p>v2aryPlug插件：<a rel="noreferrer noopener" aria-label=" 服务端插件（在新窗口打开）" href="https://www.luisimon.com/goto/s4x7" rel="nofollow" target="_blank">服务端插件</a>。 <a rel="noreferrer noopener" href="https://www.luisimon.com/goto/uc6z" rel="nofollow" target="_blank">项目地址</a>  </p>



<p>首先我们在命令行输入<strong><em>pwd</em></strong>命令，查看是否在root目录下。如果是，那在下一行应该显示 /root，否则我们应该输入以下命令：</p>



<pre class="wp-block-code"><code>cd /root/</code></pre>



<p>我们通过<em><strong>wget</strong></em>命令把上面的“一件安装脚本”和“服务端插件”下载到VPS。</p>



<p>下载命令格式：wget [文件网络地址]  </p>



<p>执行权限设置命令格式：chmod a+x [文件路径]</p>



<p>解压文件命令格式：tar -zxvf [文件路径]</p>



<p>直接复制下面两行命令到命令行窗口执行（如果下面地址失效，请到上面项目地址找对应文件）</p>



<pre class="wp-block-code"><code>wget -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh &amp;&amp; chmod a+x shadowsocks-all.sh</code></pre>



<pre class="wp-block-code"><code>wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.3.0/v2ray-plugin-linux-amd64-v1.3.0.tar.gz &amp;&amp; tar -zxvf v2ray-plugin-linux-amd64-v1.3.0.tar.gz</code></pre>



<p><strong>安装代理服务</strong></p>



<p>执行一下命令进行安装，在安装过程中我们全程敲击回车键即可。（因为在安装前的所有配置都不是我们需要的）</p>



<pre class="wp-block-code"><code>./shadowsocks-all.sh</code></pre>



<p><strong>代理服务运行与维护</strong></p>



<p>前面，我们已经在CloudFlare上生成了证书并且保存了下来。把生成的证书分别复制到VPS中，如果会使用FTP工具，可以直接在本地重命名，再使用FTP工具传到VPS中，但由于每个人电脑环境不同，保存的文件格式不一定能在Linux上正确识别，所以下面我们通过复制文本，并在VPS上创建公私钥文件，请不要担心这会很复杂，下面是文件名称：</p>



<pre class="wp-block-verse">公钥文件名称：full_chain.pem<br>私钥文件名称：private.key</pre>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p>公钥文件创建：先在本地全选复制“公钥.txt”里面的所有文本数据，执行一下命令后，按键盘上的“i”键，在命令行底部会出现“&#8211; INSERT &#8211;”字样，表示当前是插入模式，此时我们把复制好的公钥文本数据粘贴到这里，在按键盘上的“Esc”退出编辑模式，此时命令行下方出现一个“:”，在冒号后面输入“wq”并回车，我们就完成公钥文件的创建了。</p>



<p> 私钥文件创建： 依此，用同样办法创建私钥文件。</p>



<pre class="wp-block-code"><code>vim full_chain.pem
vim private.key</code></pre>
</div></div>



<p>为了方便使用，接下来我们创建启动脚本“runSs.sh”，以及添加脚本到开机执行。</p>



<pre class="wp-block-code"><code>vim runSs.sh</code></pre>



<p>添加下方命令到“runSs.sh”中</p>



<pre class="wp-block-code"><code>#!/bin/bash
nohup ss-server -k &#91;替换为你的密码] -p 443 -m aes-256-gcm --plugin /root/v2ray-plugin_linux_amd64 --plugin-opts "server;tls;host=&#91;替换为你的域名];cert=/root/full_chain.pem;key=/root/private.key;loglevel=none" &gt; /dev/null 2&gt;&amp;1 &amp;</code></pre>



<p>执行下面命令（设置运行脚本权限，添加开机启动，开启防火墙端口(CentOS7)）</p>



<pre class="wp-block-code"><code>chmod a+x runSs.sh
echo ./root/runSs.sh &gt;&gt; /etc/rc.d/rc.local
chmod a+x /etc/rc.d/rc.local
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload</code></pre>



<p>至此服务器已经配置完成！</p>



<h2 class="wp-block-heading"><strong>客户端配置</strong></h2>



<p><strong>客户端程序下载</strong></p>



<p>shadowsocks地址：<a rel="noreferrer noopener" aria-label="客户端程序（在新窗口打开）" href="https://www.luisimon.com/goto/nodo" rel="nofollow" target="_blank">客户端程序</a>。<a rel="noreferrer noopener" aria-label="项目地址（在新窗口打开）" href="https://www.luisimon.com/goto/owlu" rel="nofollow" target="_blank">项目地址</a></p>



<p>v2ray插件地址：<a rel="noreferrer noopener" aria-label="插件（在新窗口打开）" href="https://www.luisimon.com/goto/j5it" rel="nofollow" target="_blank">插件</a>。<a href="https://www.luisimon.com/goto/tsog" target="_blank" rel="nofollow noreferrer noopener" aria-label="项目地址（在新窗口打开）">项目地址</a></p>



<p><strong>客户端配置</strong></p>



<p>把v2ray插件解压到Shadowsocks目录下 。</p>



<p>如图⑦，根据在VPS中的“runSs.sh”启动文件配置，填写好客户端的配置。</p>



<ul class="wp-block-list">
<li>服务器地址：填写在CloudFlare开启了CDN的那个完整域名</li>



<li>服务器端口：默认443，使用CDN时候必须是443</li>



<li>密码：查看“runSs.sh”-k 后面的即是需要填写的密码</li>



<li>加密：查看“runSs.sh”-m后面的 即是需要选择的密加密算法</li>



<li>插件程序：复制插件文件名（不包含后缀名）粘贴到这里</li>



<li>插件选项：tls;host=[替换为你的域名]，注意这里的host必须和服务器配置的一致，否则无法通讯</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="257" height="329" src="https://www.luisimon.com/wp-content/uploads/2020/04/20200407061359.jpg" alt="" class="wp-image-303" srcset="https://www.luisimon.com/wp-content/uploads/2020/04/20200407061359.jpg 257w, https://www.luisimon.com/wp-content/uploads/2020/04/20200407061359-234x300.jpg 234w" sizes="auto, (max-width: 257px) 100vw, 257px" /><figcaption class="wp-element-caption">图⑦ 客户端配置</figcaption></figure></div>


<p>至此客户端也配置完成，最后在任务栏中找到shadowsocks图标，查看是否为灰色，如果是灰色，则右键在“系统代理”一栏中选择“PAC模式”。</p>



<p><strong>火狐浏览器配置</strong></p>



<p>在点击浏览器右上角菜单按钮打开“选项”，在“常规”的最底部的“网络设置”中单击“设置”，选择“使用系统代理设置”。</p>



<p><strong>完成</strong></p>



<p>至此所有工作完成，现在可以自由地连接互联网了。Flower</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SVN仓库迁移到Git（教程）</title>
		<link>https://www.luisimon.com/2023/04/22/697/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Sat, 22 Apr 2023 12:32:41 +0000</pubDate>
				<category><![CDATA[編程三兩事]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[完整迁移]]></category>
		<category><![CDATA[迁移]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=697</guid>

					<description><![CDATA[以下是：把SVN项目仓库整体迁移到Git上，以切换到Git版本控制。 大致流程：通过命令先把SVN库导出到本地 ... <a title="SVN仓库迁移到Git（教程）" class="read-more" href="https://www.luisimon.com/2023/04/22/697/" aria-label="继续阅读SVN仓库迁移到Git（教程）">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>以下是：把SVN项目仓库整体迁移到Git上，以切换到Git版本控制。</p>



<p>大致流程：通过命令先把SVN库导出到本地git仓库，再把本地仓库和远端新建仓库关联并推送到远端新仓库库中。</p>



<p>在任意目录右键，单机“Git Bash Here”打开git命令仓库，执行以下语句：</p>



<pre class="wp-block-code"><code>git config --global user.name "Alan"</code></pre>



<p>Alan为用户名称，注意是用户全名，并非有”@“符号那个URL目录名称。</p>



<pre class="wp-block-code"><code>git config --global user.email "Alan@gmail.com"   </code></pre>



<p>用户邮件，即是账号注册登录的电子邮件地址。</p>



<pre class="wp-block-code"><code>git config --list</code></pre>



<p>查看当前配置，可以看见前面设置的用户名称和电子邮件地址。</p>



<pre class="wp-block-code"><code>Alan=Alan&lt;Alan@gmail.com&gt;</code></pre>



<p>创建一个SVN与Git用户名映射的文件，左边是SVN，右边是Git。</p>



<pre class="wp-block-code"><code>git svn clone &#91;-r 282506:HEAD] &#91;svn地址] --no-metadata --authors-file=&#91;用户名映射文件] &#91;git文件夹名称(在当前目录下创建)]</code></pre>



<p>把SVN库导出成git仓库到本地。注意：-r 282506:HEAD是指定导出某一个版本的代码，不加此参数就是完整克隆SVN仓库（所有提交记录），这也是本次的目的。注意：通过SVN客户端在本地创建的库，需要导入到SVN服务端才能导入。在SVN服务端直接导入本地磁盘库目录即可。</p>



<pre class="wp-block-code"><code>cd &#91;git仓库目录]
git remote add origin &#91;git远程地址]
git remote -v #查看是否正确关联
git remote rm origin #取消关联</code></pre>



<p>进入本地git仓库(刚刚从SVN导出创建的git仓库)，并把本地git仓库与远程仓库关联。</p>



<pre class="wp-block-code"><code>git push -u origin master
git pull --rebase origin master #推送失败可以尝试：先拉取远程git项目文件(README.md)</code></pre>



<p>推送本地仓库到远程。</p>



<p>参考出处：https://www.cnblogs.com/mq0036/p/14699655.html</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>51单片机，3相步进电机驱动代码</title>
		<link>https://www.luisimon.com/2023/01/27/690/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Fri, 27 Jan 2023 12:35:39 +0000</pubDate>
				<category><![CDATA[单片机]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=690</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<pre class="wp-block-code"><code>void main(void)
{
	unsigned char Mot_Ctrl = 0x04;
	unsigned char i = 0;
	//通过 P3.2，P3.3，P3.4 IO口驱动，低电平驱动
	while(1)
	{
		Delay500ms();
		P3 |= 0x1C;
		P3 = ~Mot_Ctrl &amp; P3;
		Mot_Ctrl &lt;&lt;= 1;	
		Mot_Ctrl = Mot_Ctrl == 0x20 ? 0x04 : Mot_Ctrl;
	}
}
</code></pre>
</blockquote>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>红外遥控器NEC协议(简介)</title>
		<link>https://www.luisimon.com/2023/01/03/672/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Mon, 02 Jan 2023 17:15:04 +0000</pubDate>
				<category><![CDATA[随手记录]]></category>
		<category><![CDATA[NEC]]></category>
		<category><![CDATA[NEC协议]]></category>
		<category><![CDATA[单片机]]></category>
		<category><![CDATA[红外]]></category>
		<category><![CDATA[红外遥控器]]></category>
		<category><![CDATA[遥控器]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=672</guid>

					<description><![CDATA[NEC协议是在红外遥控器中较为常用的一种。 协议使用38K载波对数据进行调制（建议采用是⅓占空比，即1个时间单 ... <a title="红外遥控器NEC协议(简介)" class="read-more" href="https://www.luisimon.com/2023/01/03/672/" aria-label="继续阅读红外遥控器NEC协议(简介)">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>NEC协议是在红外遥控器中较为常用的一种。</p>



<p>协议使用38K载波对数据进行调制（建议采用是⅓占空比，即1个时间单位的高电平(LED亮)+2个时间单位的低电平(LED灭)）。</p>



<p>数据调制的基准时间宽度T为560μs。</p>



<p>基本格式：引导码+用户码+用户码反码+数据码+数据码反码+结束码。一般用户码同一款遥控器相同。</p>



<p>数据发送顺序：从低位向高位发送。（例如0xF0(11110000)，先发0000再发1111）</p>



<p>格式详解：</p>



<ul class="wp-block-list">
<li>引导码：9ms载波+4.5ms空闲</li>



<li>逻辑1：560μs载波+1.68ms空闲</li>



<li>逻辑0：560μs载波+560μs空闲</li>



<li>结束码：560μs载波</li>



<li class="has-cyan-bluish-gray-color">重复码：9ms载波+2.25ms空闲</li>
</ul>



<p class="has-cyan-bluish-gray-color has-text-color">按基准时间格式详解：</p>



<ul class="wp-block-list">
<li class="has-cyan-bluish-gray-color">引导码：16T载波+8T空闲</li>



<li class="has-cyan-bluish-gray-color">逻辑1：1T载波+3T空闲</li>



<li class="has-cyan-bluish-gray-color">逻辑0：1T载波+1T空闲</li>



<li class="has-cyan-bluish-gray-color">结束码：1T载波</li>



<li class="has-cyan-bluish-gray-color">重复码：16T载波+4T空闲</li>
</ul>



<p><strong>注意：无论38K载波还是调制间隔时间都允许一定的误差，比如美的遥控器载波是38.186K。</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="505" src="https://www.luisimon.com/wp-content/uploads/2023/01/wave-1024x505.png" alt="" class="wp-image-673" srcset="https://www.luisimon.com/wp-content/uploads/2023/01/wave-1024x505.png 1024w, https://www.luisimon.com/wp-content/uploads/2023/01/wave-300x148.png 300w, https://www.luisimon.com/wp-content/uploads/2023/01/wave-768x379.png 768w, https://www.luisimon.com/wp-content/uploads/2023/01/wave-1536x758.png 1536w, https://www.luisimon.com/wp-content/uploads/2023/01/wave.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">逻辑分析仪抓取（图中数据：用户码是0x00，数据码是0x45）</figcaption></figure></div>


<p>重复码（通常可以不做处理，即不发送）：有一种场景就是我们一直按住按键不松手，则需要每隔110ms发送一次重复码。第一次重复码发送间隔需要算上前面按键数据的时间。<strong>注：重复码也需要发送结束标志（即结束码）。</strong></p>



<pre class="wp-block-preformatted has-vivid-red-color has-text-color has-link-color wp-elements-b1fcc0c395724707a1a27c28a8f72e3c">着重注意一下：很多博客并没有提到协议中的结束码问题（本人测试时候就发现连续发送信号偶尔成功，原因就是没有发送结束码，而偶然成功只是因为操作速度刚刚好令到设备把我下一帧信号的开头当作结束码）。</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RS触发器原理解释</title>
		<link>https://www.luisimon.com/2023/01/02/655/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Mon, 02 Jan 2023 04:56:50 +0000</pubDate>
				<category><![CDATA[随手记录]]></category>
		<category><![CDATA[RS]]></category>
		<category><![CDATA[RS触发器]]></category>
		<category><![CDATA[数字电路]]></category>
		<category><![CDATA[硬件电路]]></category>
		<category><![CDATA[触发器]]></category>
		<category><![CDATA[锁存器]]></category>
		<guid isPermaLink="false">https://www.luisimon.com/?p=655</guid>

					<description><![CDATA[RS触发器经典作用是用来保存1bit数据。其主要由两个“或非门”（或者“与非门”）组成，其中或非门的输出结果会 ... <a title="RS触发器原理解释" class="read-more" href="https://www.luisimon.com/2023/01/02/655/" aria-label="继续阅读RS触发器原理解释">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>RS触发器经典作用是用来保存1bit数据。其主要由两个“或非门”（或者“与非门”）组成，其中或非门的输出结果会和另一个或非门的其中一个输入连接，作为输入。实际上R和S没有本质区别，电路对称。如图：</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="426" height="328" src="https://www.luisimon.com/wp-content/uploads/2023/01/图片.png" alt="" class="wp-image-656" srcset="https://www.luisimon.com/wp-content/uploads/2023/01/图片.png 426w, https://www.luisimon.com/wp-content/uploads/2023/01/图片-300x231.png 300w" sizes="auto, (max-width: 426px) 100vw, 426px" /><figcaption class="wp-element-caption"> <strong>电路原理图</strong></figcaption></figure></div>


<p>简述基本使用原理：根据特征表可以知道RS触发器有3种状态。分为“设置”、“保持”和“非稳定态（禁止使用）”。R和S分别处于不同值时，用于设置Q的值，把R和S都设置为0时可以保持Q为上一次的状态（即是通过R和S设置不同值时的状态）。</p>



<p>而非稳定态则是RS都为1或者RS处于开路悬空时状态不稳定，不可以使用的状态。</p>



<p>举例子：假如Q接一盏LED灯，当我们给R接负极（即为“0”），S接正极（即为“1”），那么Q输出为“1”，即LED灯点亮。此时我们把S接到负极（即为”0“），LED依然点亮，此为保持上一次状态。需要熄灭LED，把R接正极再接会负极即可。</p>



<p class="has-vivid-purple-color has-text-color has-background" style="background:radial-gradient(rgb(202,248,128) 0%,rgb(113,206,126) 100%)">总结简单口诀：RS均为0时可以保持RS在不同值时的输出。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://www.luisimon.com/wp-content/uploads/2023/01/图片-3.png" alt="" class="wp-image-659" width="366" height="257" srcset="https://www.luisimon.com/wp-content/uploads/2023/01/图片-3.png 366w, https://www.luisimon.com/wp-content/uploads/2023/01/图片-3-300x211.png 300w" sizes="auto, (max-width: 366px) 100vw, 366px" /><figcaption class="wp-element-caption"><strong>RS触发器特征表</strong></figcaption></figure></div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="125" height="181" src="https://www.luisimon.com/wp-content/uploads/2023/01/图片-2.png" alt="" class="wp-image-658"/><figcaption class="wp-element-caption"><strong>与非门真值表</strong></figcaption></figure></div>


<p class="has-text-align-center has-luminous-vivid-orange-color has-text-color">注：与非门真值表可以忽略不看</p>



<p class="has-white-background-color has-text-color has-background" style="color:#cf2d3e">其他：与非门则是同为”1“时是保持状态，同为”0“时是禁止状态。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="https://www.luisimon.com/goto/om8r" target="_blank" rel="nofollow noreferrer noopener">https://www.bilibili.com/video/BV1Cy4y1H7du</a></p>
<cite>讲解视频</cite></blockquote>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>.Net(C#) DateTime的ToString方法格式化(Format)</title>
		<link>https://www.luisimon.com/2021/04/02/468/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Fri, 02 Apr 2021 07:07:25 +0000</pubDate>
				<category><![CDATA[編程三兩事]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.luisimon.xyz/?p=468</guid>

					<description><![CDATA[在C#中调用时间转字符串格式的ToString(&#8220;format&#8221;)函数，以下是格式说明 ... <a title=".Net(C#) DateTime的ToString方法格式化(Format)" class="read-more" href="https://www.luisimon.com/2021/04/02/468/" aria-label="继续阅读.Net(C#) DateTime的ToString方法格式化(Format)">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>在C#中调用时间转字符串格式的ToString(&#8220;format&#8221;)函数，以下是格式说明</p>



<h2 class="wp-block-heading">年份部分</h2>



<ul class="wp-block-list">
<li>1、<strong>yyyy</strong> => 完整的年份数字。（例如：2020、2021）</li>



<li>2、<strong>yyy</strong> => 完整的年份数字，效果同“yyyy”。</li>



<li>3、<strong>yy</strong> => 年份后两位数字。（例如：20、21）</li>



<li>4、<strong>y</strong> => 年份后两位数字，效果同“yy”</li>
</ul>



<h2 class="wp-block-heading">月份部分</h2>



<ul class="wp-block-list">
<li>1、<strong>MMMM</strong> => 月份的完整英文。（例如：August）</li>



<li>2、<strong>MMM</strong> => 月份的英文缩写。（例如：Aug）</li>



<li>3、<strong>MM</strong> => 月份前位补零数字。（例如：01、12）</li>



<li>4、<strong>M</strong> => 月份不补零数字。（例如：1，12）</li>
</ul>



<h2 class="wp-block-heading">日期部分</h2>



<ul class="wp-block-list">
<li>1、<strong>dddd</strong> => 星期部分的完整英文。（例如：Sunday）</li>



<li>2、<strong>ddd</strong> => 星期部分的英文缩写。（例如：Sun）</li>



<li>3、<strong>dd</strong> => 日期前位补零数字。（例如：01）</li>



<li>4、<strong>d </strong>=> 日期不补零数字。（例如：1）</li>
</ul>



<h2 class="wp-block-heading">小时部分</h2>



<ul class="wp-block-list">
<li>1、<strong>HH</strong> => 24小时制，前位补零。（例如：03、23）</li>



<li>2、<strong>H</strong> => 24小时制，不补零。（例如：3、23）</li>



<li>3、<strong>hh</strong> => 12小时制，前位补零。（例如：03，11）</li>



<li>4、<strong>h</strong> => 12小时制，不补零。（例如：3，11）</li>



<li>5、<strong>tt</strong> => 英文上下午标识。（例如：AM、PM）</li>



<li>6、<strong>t</strong> => 英文上下午标识简写。（例如：A、P）</li>
</ul>



<h2 class="wp-block-heading">分钟部分</h2>



<ul class="wp-block-list">
<li>1、<strong>mm</strong> => 有前位补零的分钟数字。（例如：09、20）</li>



<li>2、<strong>m</strong> => 无补零的分钟数字。（例如：9、20）</li>
</ul>



<h2 class="wp-block-heading">秒部分</h2>



<ul class="wp-block-list">
<li>1、<strong>ss</strong> => 有前位补零的秒数字。（例如：9、21）</li>



<li>2、<strong>s</strong> => 有前位补零的秒数字。（例如：9、21）</li>
</ul>



<h2 class="wp-block-heading">毫秒部分</h2>



<ul class="wp-block-list">
<li>1、<strong>fffffff</strong>  => 秒数的小数部分最高七位有效数。</li>



<li>2、<strong>ffffff</strong> => 秒数的小数部分最高六位有效数。</li>



<li>3、<strong>fffff</strong> => 秒数的小数部分最高五位有效数。</li>



<li>4、<strong>ffff</strong> => 秒数的小数部分最高四位有效数。</li>



<li>5、<strong>fff</strong> => 秒数的小数部分最高三位有效数（常用）。</li>



<li>6、<strong>ff</strong> => 秒数的小数部分最高二位有效数。</li>



<li>7、<strong>f</strong> => 秒数的小数部分最高一位有效数。</li>
</ul>



<h2 class="wp-block-heading">其他</h2>



<ul class="wp-block-list">
<li>1、<strong>zzz</strong> => 表示时区信息，带偏移符号以及有前位补零的小时和分钟位。（例如：+08:00）</li>



<li>2、<strong>zz</strong> => 表示时区信息，带偏移符号以及有前位补零的小时位。（例如：+08）</li>



<li>3、<strong>z</strong> => 表示时区信息，带偏移符号以及无补零的小时位。（例如：+8）</li>



<li>4、<strong>K</strong> => 与“zzz”等价</li>
</ul>



<p>参考：<a rel="noreferrer noopener" href="https://www.luisimon.com/goto/n0lv" rel="nofollow" target="_blank">微软</a>、<a href="https://www.luisimon.com/goto/jjpw" target="_blank" rel="nofollow noreferrer noopener">C<strong>♯</strong> Corner（C#角落）</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CsvHelper简单上手</title>
		<link>https://www.luisimon.com/2021/03/28/451/</link>
		
		<dc:creator><![CDATA[Alan]]></dc:creator>
		<pubDate>Sun, 28 Mar 2021 11:53:30 +0000</pubDate>
				<category><![CDATA[坑]]></category>
		<category><![CDATA[編程三兩事]]></category>
		<guid isPermaLink="false">https://www.luisimon.xyz/?p=451</guid>

					<description><![CDATA[CsvHelper是一个CSV文件的帮助类库，可以通过nuget的包管理进行引用。 虽然MS Office办公 ... <a title="CsvHelper简单上手" class="read-more" href="https://www.luisimon.com/2021/03/28/451/" aria-label="继续阅读CsvHelper简单上手">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>CsvHelper是一个CSV文件的帮助类库，可以通过nuget的包管理进行引用。</p>



<p>虽然MS Office办公套件的Excel默认关联CSV文件，但其本质上还是一个文本文件。下面代码解析CSV并创建了CSV对应类实例。</p>



<p><a href="https://www.luisimon.com/goto/z07b" target="_blank" rel="nofollow noreferrer noopener">源码</a></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
static class Program
{
	static void Main()
	{
		string path = @&quot;C:\Users\Administrator\Desktop\20201201.csv&quot;;
		string csvStr = System.IO.File.ReadAllText(path, Encoding.Default);
		//using (var sr1 = new System.IO.StreamReader(path, Encoding.Default)) //从文件读取
		using (var sr1 = new System.IO.StringReader(csvStr)) //获得的是字符串的情况下，使用StringReader
		{
			var csv = new CsvReader(sr1, System.Globalization.CultureInfo.InvariantCulture);	
			csv.Context.RegisterClassMap&lt;UcCreativeMap&gt;();//注册映射类。值得注意的是在很多博文示例中都是使用这句代码“csv.Configuration.RegisterClassMap”注册映射类的，但在Ver26.1.0的CsvHelper中，并不是这样注册的，具体请移步GitHub查看源码Demo。
			var records = csv.GetRecords&lt;UcCreative&gt;();
			var list = records.ToList(); // 把 CSV 记录映射到 MyClass，返回的 records 是个 IEnumerable&lt;T&gt; 对象	
		}
	}
}

/// &lt;summary&gt;
/// 映射表头名字
/// &lt;/summary&gt;
public class CreativeMap : CsvHelper.Configuration.ClassMap&lt;UcCreative&gt;
{
	public CreativeMap()
	{	
		Map(o =&gt; o.Date).Name(&quot;日期&quot;);//指定列头名称
		Map(o =&gt; o.Date).Name(&quot;日期&quot;).NameIndex(0);// 指定存在同名列头的顺序
		Map(o =&gt; o.Date).Index(0);// 指定列头的索引顺序
	}
}
/// &lt;summary&gt;
/// Model 类
/// &lt;/summary&gt;
public class Creative
{
	public string Date { get; set; }
	public string AccountID { get; set; }
	public string Account { get; set; }
	public string AdGroupID { get; set; }
	public string AdGroup { get; set; }
}
</pre></div>


<pre class="wp-block-code"><code></code></pre>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
