<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>program tech record</title>
        <link>https://paragraph.com/@program-tech-record</link>
        <description>undefined</description>
        <lastBuildDate>Wed, 10 Jun 2026 07:45:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[关于python字节流，整形，字符串，hex字符串一些转换方法]]></title>
            <link>https://paragraph.com/@program-tech-record/python-hex</link>
            <guid>nbVUD7mSixgb1cPGbSgK</guid>
            <pubDate>Wed, 05 Jan 2022 07:41:14 GMT</pubDate>
            <description><![CDATA[字节流 <---> hex字符串python3首先说明下我用的是python3.7, 可能不能兼容所有的python3，比如early python3不一定有这些方法，但是newer python3应该是有的，具体有没有我以下用的方法要查官方文档。 我们来看一下什么是hex字符串，望文生义，它肯定是字符串类型，但是literal形式是hex，即16进制样子。 比如下面就是hex字符串hexstring = ‘2b230948b6a30834017b6c80cd5773b2c4f08f13e424ca9a4fee1f11a9bfd9f4a8d9e8833ddabc8b09df8286’ 我们可以分析出每两个字符代表一个字节，先在我要将其转成字节流，什么，你不知道字节流，好吧，我们再来看一下什么是字节流， 在python中要定义一个字节流很简单，如下：bytesstream1 = b'ABC' # 一个字符占一个字节，表现出形式就是对应的ASCII编码 bytesstream2 = b'\xe4\xb8\xad\xe6\x96\x87' 他们在网络中都是一个字节一个字节地传输。 那么...]]></description>
            <content:encoded><![CDATA[<h2 id="h-less-greater-hex" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">字节流 &lt;---&gt; hex字符串</h2><h3 id="h-python3" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">python3</h3><p>首先说明下我用的是python3.7, 可能不能兼容所有的python3，比如early python3不一定有这些方法，但是newer python3应该是有的，具体有没有我以下用的方法要查官方文档。</p><p>我们来看一下什么是hex字符串，望文生义，它肯定是字符串类型，但是literal形式是hex，即16进制样子。 比如下面就是hex字符串</p><pre data-type="codeBlock" text="hexstring = ‘2b230948b6a30834017b6c80cd5773b2c4f08f13e424ca9a4fee1f11a9bfd9f4a8d9e8833ddabc8b09df8286’
"><code><span class="hljs-attr">hexstring</span> = ‘<span class="hljs-number">2</span>b230948b6a30834017b6c80cd5773b2c4f08f13e424ca9a4fee1f11a9bfd9f4a8d9e8833ddabc8b09df8286’
</code></pre><p>我们可以分析出每两个字符代表一个字节，先在我要将其转成字节流，什么，你不知道字节流，好吧，我们再来看一下什么是字节流， 在python中要定义一个字节流很简单，如下：</p><pre data-type="codeBlock" text="bytesstream1 = b&apos;ABC&apos; # 一个字符占一个字节，表现出形式就是对应的ASCII编码
bytesstream2 = b&apos;\xe4\xb8\xad\xe6\x96\x87&apos;
"><code><span class="hljs-attr">bytesstream1</span> = b<span class="hljs-string">'ABC'</span> <span class="hljs-comment"># 一个字符占一个字节，表现出形式就是对应的ASCII编码</span>
<span class="hljs-attr">bytesstream2</span> = b<span class="hljs-string">'\xe4\xb8\xad\xe6\x96\x87'</span>
</code></pre><p>他们在网络中都是一个字节一个字节地传输。 那么问题来了，在python中要怎么相互转换呢？</p><h4 id="h-hex-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">hex字符串 -&gt; 字节流：</h4><p>bytes.fromhex(string), 此 bytes 类方法返回一个解码给定字符串的 bytes 对象。 字符串必须由表示每个字节的两个十六进制数码构成，其中的 ASCII 空白符会被忽略。</p><pre data-type="codeBlock" text="&gt;&gt;&gt;bytes.fromhex(&apos;2Ef0 F1f2  &apos;)
b&apos;.\xf0\xf1\xf2&apos;
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-built_in">bytes</span>.fromhex(<span class="hljs-string">'2Ef0 F1f2  '</span>)
b<span class="hljs-string">'.\xf0\xf1\xf2'</span>
</code></pre><h4 id="h-greater-hex" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字节流 -&gt; hex字符串：</h4><p>hex()，返回一个字符串对象，该对象包含实例中每个字节的两个十六进制数字。</p><pre data-type="codeBlock" text="&gt;&gt;&gt;b&apos;\xf0\xf1\xf2&apos;.hex()
&apos;f0f1f2&apos;
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span>b<span class="hljs-string">'\xf0\xf1\xf2'</span>.hex()
<span class="hljs-string">'f0f1f2'</span>
</code></pre><p><em>另外可以参看bytearray，区别可能就是，bytearray对应的对象是可变对应物，而bytes对应对象是不可变</em>。</p><h3 id="h-python2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">python2</h3><p>python2和python3有很大区别，上面说的函数好像是只有python3才有的（没有仔细了解），所以到了python2，那些函数基本上不可用，或者说用法也有很大的不一样。ok，接下来我们看看python2怎么去实现字节流和hex字符串相互转换。</p><p>python2 字符串<strong>对象</strong>中有两个函数，分别叫decode和encode，顾名思义decode是解码，encode是编码，解码就是以指定的格式解码成本来的样子，而编码就是以指定的方式编码成所要的样子(比如ASCII，unicode等等)，我这样说的如果看不懂，就不要写代码了吧，回家种田养猪去吧。 假定我们现在有一串hex字符串：</p><pre data-type="codeBlock" text="&gt;&gt; hexstring = ‘2b230948b6a30834017b6c80cd5773b2c4f08f13e424ca9a4fee1f11a9bfd9f4a8d9e8833ddabc8b09df8286’
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span> hexstring <span class="hljs-operator">=</span> ‘2b230948b6a30834017b6c80cd5773b2c4f08f13e424ca9a4fee1f11a9bfd9f4a8d9e8833ddabc8b09df8286’
</code></pre><p>每两个字符为一个字节，那么总共有88个字符，那就是44个字节，所以我们要怎么将其变成b&apos;\x2b\x23...&apos;，刚刚说了这个hex字符串是经过编码的，编码方式是hex。</p><h4 id="h-hex-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">hex字符串 -&gt; 字节流：</h4><p>str.decode([encoding[, errors]])</p><pre data-type="codeBlock" text="&gt;&gt;&gt; hexstring.decode(&apos;hex&apos;)
&apos;+#\tH\xb6\xa3\x084\x01{l\x80\xcdWs\xb2\xc4\xf0\x8f\x13\xe4$\xca\x9aO\xee\x1f\x11\xa9\xbf\xd9\xf4\xa8\xd9\xe8\x83=\xda\xbc\x8b\t\xdf\x82\x86&apos;
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> hexstring.decode(<span class="hljs-string">'hex'</span>)
<span class="hljs-string">'+#\tH\xb6\xa3\x084\x01{l\x80\xcdWs\xb2\xc4\xf0\x8f\x13\xe4$\xca\x9aO\xee\x1f\x11\xa9\xbf\xd9\xf4\xa8\xd9\xe8\x83=\xda\xbc\x8b\t\xdf\x82\x86'</span>
</code></pre><p>以上得到不过是字符串，并不是字节流，经过查资料，发现并没有很好地方法转成b&apos; &apos;这种形式，所以只能先转成整形列表，这目前来看是最方便的，有其他更好的方法后续再更新（立个flag，大概率会忘记）</p><pre data-type="codeBlock" text="map(ord，hexsring.decode(&apos;hex&apos;))
"><code><span class="hljs-keyword">map</span>(<span class="hljs-keyword">ord</span>，hexsring.decode(<span class="hljs-string">'hex'</span>))
</code></pre><h4 id="h-greater-hex" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字节流 -&gt; hex字符串：</h4><pre data-type="codeBlock" text="&gt;&gt;&gt; a =b&apos;\x0b\xaa\xff\xee\xe0\x30\x6a
&gt;&gt;&gt; a.encode(&apos;hex&apos;)
&apos;0baaffeee0306a&apos;
"><code><span class="hljs-meta prompt_">>>></span> <span class="python">a =<span class="hljs-string">b'\x0b\xaa\xff\xee\xe0\x30\x6a</span></span>
<span class="hljs-meta prompt_">>>></span> <span class="python"><span class="hljs-string">a.encode('</span><span class="hljs-built_in">hex</span><span class="hljs-string">')</span></span>
'0baaffeee0306a'
</code></pre><p>这样就很好将字节流转成hex字符串，what&apos;s more，发现了一个很奇怪的问题，请看代码：</p><pre data-type="codeBlock" text="&gt;&gt;&gt; a =&apos;\x0b\xaa\xff\xee\xe0\x30\x6a&apos;
&gt;&gt;&gt; a.encode(&apos;hex&apos;)
&apos;0baaffeee0306a&apos;
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> a <span class="hljs-operator">=</span><span class="hljs-string">'\x0b\xaa\xff\xee\xe0\x30\x6a'</span>
<span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> a.encode(<span class="hljs-string">'hex'</span>)
<span class="hljs-string">'0baaffeee0306a'</span>
</code></pre><p>有没有发现，python2不分字节码，前面加b和不加b没有任何区别，单个字符本来也是ASCII编码也是一个字节，所以用字符串表示的也可以看做是字节流，所以字符串也是可以用encode（）直接转成hex字符串。</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">参考</h3><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.python.org/zh-cn/3.7/library/stdtypes.html?highlight=bytes#bytes">官方参考文档</a>（python3）</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.python.org/2.7/library/stdtypes.html?highlight=decode#str.decode">官方参考文档</a>](python2)</p></li></ol><h2 id="h-less-greater" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">字节流&lt;----&gt;整形列表</h2><h3 id="h-python3" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">python3</h3><p>字节流我们已经很清楚了，就不再多说了，至于整形列表，简单说就是python 列表中元素都是整形数字，例如l=[100, 255, 129, 8, 90, 99, 71], 由于一个字节是8位，所以列表中数字我们一般认为范围在0 &lt;= x &lt;256，超过256或者小于0的我们会有其他方法进行转换，后面再说。</p><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字节流 -&gt; 整形列表：</h4><p>字节流转换成整形列表是很容易的：</p><pre data-type="codeBlock" text="&gt;&gt;&gt; a = b&apos;\x0b\xaa\x77\x88\x55\x01&apos;
&gt;&gt;&gt; list(a)
[11, 170, 119, 136, 85, 1]
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> a <span class="hljs-operator">=</span> b<span class="hljs-string">'\x0b\xaa\x77\x88\x55\x01'</span>
<span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> list(a)
[<span class="hljs-number">11</span>, <span class="hljs-number">170</span>, <span class="hljs-number">119</span>, <span class="hljs-number">136</span>, <span class="hljs-number">85</span>, <span class="hljs-number">1</span>]
</code></pre><p><em>1. bytes 字面值中只允许 ASCII 字符（无论源代码声明的编码为何）。 任何超出 127 的二进制值必须使用相应的转义序列形式加入 bytes 字面值。</em> <em>2. bytes 对象的表示使用字面值格式 (b&apos;...&apos;)，因为它通常都要比像 bytes([46, 46, 46]) 这样的格式更好用。 你总是可以使用 list(b) 将 bytes 对象转换为一个由整数构成的列表</em> 上述抄取官方文档，使用list函数就能将bytes对象转换成整数列表。</p><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">整形列表 -&gt; 字节流：</h4><p>说到这个，我脑海第一时间想到便是struct的库，但是又觉得应该还有其他方法，不管怎样，咱们先来看看strcut如何使用的，talk is cheap，show you the code：</p><pre data-type="codeBlock" text="import struct
b = struct.pack(&apos;!{}B&apos;.format(len(a)), *a)
print(b)
b&apos;\x0b\xaaw\x88U\x01&apos;
"><code><span class="hljs-keyword">import</span> <span class="hljs-keyword">struct</span>
b = <span class="hljs-keyword">struct</span>.pack(<span class="hljs-string">'!{}B'</span>.format(<span class="hljs-built_in">len</span>(a)), *a)
<span class="hljs-built_in">print</span>(b)
b<span class="hljs-string">'\x0b\xaaw\x88U\x01'</span>
</code></pre><p>其中！是大端序，一般用于网络传输，需要其它字节序，请更改，B是unsigned char 整形占一个字节，字节长度就是列表长度，特别注意的是，传入参数，由于列表长度是6个，当你如果传入参数只写a，会提示需要6个参数，但是只传了1个，所以需要加以改正，但是我们总不可能手动一个一个的写传入的参数，假设列表是100个，手写100个参数是不是要累死。在python中，* 会自动将参数打包成tuple传给函数，多参数可以这样做，如果是要传入指定参数，比如a = 1，b = 2，这种可以用**</p><p>除了这种方法外，参考官方文档后，发现还要更好的方法：</p><pre data-type="codeBlock" text="a = bytes([11, 170, 119, 136, 85, 1])
print(a)
b&apos;\x0b\xaaw\x88U\x01&apos;
"><code><span class="hljs-selector-tag">a</span> = bytes(<span class="hljs-selector-attr">[11, 170, 119, 136, 85, 1]</span>)
print(<span class="hljs-selector-tag">a</span>)
<span class="hljs-selector-tag">b</span>'\x0b\xaaw\x88U\x01'
</code></pre><p>字面值：a = b&apos;saa\x0b\xaa\x77\x88\x55\x01&apos;除了字面值形式，bytes 对象还可以通过其他几种方式来创建：</p><ul><li><p>指定长度的以零值填充的 bytes 对象: bytes(10)</p></li><li><p>通过由整数组成的可迭代对象: bytes(range(20))</p></li><li><p>通过缓冲区协议复制现有的二进制数据: bytes(obj)</p></li></ul><p>当然还有bytearray对象也可以像bytes一样 ，唯一不同就是bytearray对象是可变序列。 另外使用int.to_bytes函数是将一个整数分解成一个字节一个字节形式。</p><h3 id="h-python2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">python2</h3><p>咱们再来看看使用同样的方法应用在python2上，发现结果完全不一样，这是为什么？</p><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字节流 -&gt; 整形列表</h4><pre data-type="codeBlock" text="&gt;&gt;&gt; a = b&apos;\x0b\xaa\x77\x88\x55\x01&apos;
&gt;&gt;&gt; list(a)
[&apos;\x0b&apos;, &apos;\xaa&apos;, &apos;w&apos;, &apos;\x88&apos;, &apos;U&apos;, &apos;\x01&apos;]
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> a <span class="hljs-operator">=</span> b<span class="hljs-string">'\x0b\xaa\x77\x88\x55\x01'</span>
<span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> list(a)
[<span class="hljs-string">'\x0b'</span>, <span class="hljs-string">'\xaa'</span>, <span class="hljs-string">'w'</span>, <span class="hljs-string">'\x88'</span>, <span class="hljs-string">'U'</span>, <span class="hljs-string">'\x01'</span>]
</code></pre><p>经过一番仔细探究，咱们再来看看</p><pre data-type="codeBlock" text="&gt;&gt;&gt; a = b&apos;\x0b\xaa\x77\x88\x55\x01&apos;
&gt;&gt;&gt; type(a)
&lt;type &apos;str&apos;&gt;
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> a <span class="hljs-operator">=</span> b<span class="hljs-string">'\x0b\xaa\x77\x88\x55\x01'</span>
<span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> <span class="hljs-keyword">type</span>(a)
<span class="hljs-operator">&#x3C;</span><span class="hljs-keyword">type</span> <span class="hljs-string">'str'</span><span class="hljs-operator">></span>
</code></pre><p>在python2中，是没有字节串这一说的，也就说字节串和字符串是一个意思。 咱们再来看看python3。</p><pre data-type="codeBlock" text="a = b&apos;\x0b\xaa\x77\x88\x55\x01&apos;
type(a)
&lt;class &apos;bytes&apos;&gt;
"><code>a <span class="hljs-operator">=</span> b<span class="hljs-string">'\x0b\xaa\x77\x88\x55\x01'</span>
<span class="hljs-keyword">type</span>(a)
<span class="hljs-operator">&#x3C;</span>class <span class="hljs-string">'bytes'</span><span class="hljs-operator">></span>
</code></pre><p>看到没有在python3中是有bytes这个类型的。 所以要想在python2中将字节串（其实还是字符串啦）转成整数列表，得曲线救国了。 here it is：</p><pre data-type="codeBlock" text="&gt;&gt;&gt; map(ord, a)
[11, 170, 119, 136, 85, 1]
"><code><span class="hljs-meta prompt_">>>></span> <span class="python"><span class="hljs-built_in">map</span>(<span class="hljs-built_in">ord</span>, a)</span>
[11, 170, 119, 136, 85, 1]
</code></pre><p>另外多说一句，map函数在python2中返回时列表，在python3中有所不同，具体参考官方文档。</p><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">整形列表 -&gt; 字节流</h4><p>当然，python2中也是有struct的，所以咱们还是先来试试struct效果</p><pre data-type="codeBlock" text="&gt;&gt;&gt; b = struct.pack(&apos;!{}B&apos;.format(len(a)), *a)
&gt;&gt;&gt; print(b)
獁圲
&gt;&gt;&gt; print(repr(b))
&apos;\x0b\xaaw\x88U\x01&apos;
"><code><span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> b <span class="hljs-operator">=</span> <span class="hljs-keyword">struct</span>.pack(<span class="hljs-string">'!{}B'</span>.format(len(a)), <span class="hljs-operator">*</span>a)
<span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> print(b)
獁圲
<span class="hljs-operator">></span><span class="hljs-operator">></span><span class="hljs-operator">></span> print(repr(b))
<span class="hljs-string">'\x0b\xaaw\x88U\x01'</span>
</code></pre><p>可以看到python2 和 python3 有所不同，python3使用print可以直接打印出字节串，但是用直接python2打印会乱码，所以用repr转换婴一下就能看到效果了，刚刚说过python2中不存在字节这一说的，所以显示的直接是字符串而不是以b开头的字节串。</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">参考文档</h3><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.python.org/zh-cn/3.7/library/stdtypes.html#bytes">bytes官方文档</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.python.org/zh-cn/3.7/library/struct.html?highlight=struct#module-struct">struct官方文档</a></p></li></ol><h2 id="h-less-greater" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">字节流 &lt;----&gt; 字符串</h2><h3 id="h-python3" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">python3</h3><p>字符串经过某种编码方式就转换成了字节串，解码后就变成它原本的样子，比如s = ‘hello,world&apos;，这个是字符串，但是这个仅仅是我们看到的样子，或者说是它对外表现的形式，但是在计算机内存中肯定是一堆二进制数码，那么s对应的数码应该是多少了，所以这个时候编码就派上用场了。大家还记得大明湖畔的夏雨荷.....错了，还记得每次写py文件开头写的是东西么，比如这个</p><blockquote><h1 id="h-codingutf-8" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">-*- coding:utf-8 -*-</h1><p>这个就说明文件默认以utf-8编码，文件中字符串变量那么就是以utf-8编码的。知道这个后，我们就知道如何将字符串变成字节串了。</p></blockquote><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字节流 -&gt; 字符串</h4><p>由于ascii只有128个，可显示的95，不可显示33，所以字节转字符，字节数值只能小于等于128 话不多说，看代码：</p><pre data-type="codeBlock" text="a = b&apos;\x20\x24\x26\x2c\x2f\x4b\x50\x6e&apos;
a.decode(&apos;utf-8&apos;)
&apos; $&amp;,/KPn&apos;
"><code>a <span class="hljs-operator">=</span> b<span class="hljs-string">'\x20\x24\x26\x2c\x2f\x4b\x50\x6e'</span>
a.decode(<span class="hljs-string">'utf-8'</span>)
<span class="hljs-string">' $&#x26;,/KPn'</span>
</code></pre><p>字节串就是经过utf-8编码后的存储形式，所以通过utf-8解码得到字符串。其实你用其他的方式解码也能得到正确的字符串，这是为什么呢？ 仔细想想吧，反正我知道我也不想告诉你，自己动手查查。</p><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字符串 - &gt; 字节流</h4><p>当然所有转成字节流都可以用struct去搞定，这里我就不再赘述了，各位看官自己尝试着用struct搞定。这里我用其他方法搞定，当然是bytes.</p><pre data-type="codeBlock" text="a = &apos;hello,world&apos;
a.encode(&apos;utf-8&apos;)
b&apos;hello,world&apos;
"><code>a <span class="hljs-operator">=</span> <span class="hljs-string">'hello,world'</span>
a.encode(<span class="hljs-string">'utf-8'</span>)
b<span class="hljs-string">'hello,world'</span>
</code></pre><p>当然这样也可以：</p><pre data-type="codeBlock" text="bytes(a, &apos;utf-8&apos;)
b&apos;hello,world&apos;
"><code><span class="hljs-built_in">bytes</span>(a, <span class="hljs-string">'utf-8'</span>)
<span class="hljs-string">b'hello,world'</span>
</code></pre><h3 id="h-python2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">python2</h3><p>说真的，我已经不太想研究python2了，毕竟马上就是2020年了，python2的末日已然来临，还有什么理由不拥抱python3，是为了那些在python3 上不能用的库吗，还是习惯使然，如果是第二种，那么请改变自己保守的性格，去迎接新事物吧。吐槽归吐槽，代码还是要写的。</p><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字节流 -&gt; 字符串</h4><p>刚刚说过python2中字符串和字节串是不区分的，所以基本上可以认为字节串。当然你也可以用decode。</p><h4 id="h-greater" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">字符串 -&gt; 字节流</h4><p>刚刚说过python2中字符串和字节串是不区分的，所以基本上可以认为字节串。当然你也可以用encode。</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">参考</h3><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.python.org/zh-cn/3.7/library/stdtypes.html?highlight=encode#str.encode">str编码官方文档</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.python.org/zh-cn/3.7/library/stdtypes.html?highlight=decode#bytes.decode">bytes解码官方文档</a></p></li></ol>]]></content:encoded>
            <author>program-tech-record@newsletter.paragraph.com (program tech record)</author>
        </item>
        <item>
            <title><![CDATA[python虚拟环境转后遇到的问题]]></title>
            <link>https://paragraph.com/@program-tech-record/python</link>
            <guid>kWHIla78gopVp8nadP0L</guid>
            <pubDate>Wed, 05 Jan 2022 07:27:05 GMT</pubDate>
            <description><![CDATA[此文针对python3.7.9下遇到问题记录。 经常会遇到将虚拟环境整体搬移到其他pc机上去，又或者是更换系统，导致虚拟环境的主环境与最开始创建虚拟环境的主环境路径不一样，此时切换虚拟环境的时候会导致不可用，因此需要到虚拟环境pyvenv.cfg文件中修改主python环境改路径等信息，如图所示，隐私信息我给打码了。此时只需要将原来的配置文件中home参数替换为新环境的python环境路径，如有必要version也可以进行更改]]></description>
            <content:encoded><![CDATA[<p>此文针对python3.7.9下遇到问题记录。</p><p>经常会遇到将虚拟环境整体搬移到其他pc机上去，又或者是更换系统，导致虚拟环境的主环境与最开始创建虚拟环境的主环境路径不一样，此时切换虚拟环境的时候会导致不可用，因此需要到虚拟环境pyvenv.cfg文件中修改主python环境改路径等信息，如图所示，隐私信息我给打码了。此时只需要将原来的配置文件中home参数替换为新环境的python环境路径，如有必要version也可以进行更改</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ce654c8e7193822f7e21ec897d43b23f9198deee6581f854803a8e5d9108cad7.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure>]]></content:encoded>
            <author>program-tech-record@newsletter.paragraph.com (program tech record)</author>
        </item>
    </channel>
</rss>