- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
什么是 Python 字节串?
我能找到的只是关于如何编码为字节串或解码为 ASCII 的主题。或 UTF-8 .我试图了解它是如何在幕后工作的。在普通的 ASCII 字符串中,它是一个数组或字符列表,每个字符代表一个 0-255 的 ASCII 值,因此您可以知道数字代表什么字符。在 Unicode 中,字符的 8 或 16 字节表示可以告诉您它是什么字符。
那么什么是字节串? Python 如何知道哪些字符代表什么?它是如何在引擎盖下工作的?由于您可以打印甚至返回这些字符串,并且它会向您显示字符串表示形式,所以我不太明白...
好的,所以我的意思是肯定在这里被遗漏了。有人告诉我,这是一个 不可变 字节序列,没有任何特定的解释。
一个字节序列。好吧,假设一个字节:'a'.encode()
返回 b'a'
。
足够简单。为什么我可以阅读a?
假设我得到 a 的 ASCII 值,通过执行以下操作:printf "%d""'a"
它返回 97。好的,好的,ASCII 字符 a 的整数值。如果我们将 97 解释为 ASCII,比如在 C char
中,那么我们会得到字母 a
。很公平。如果我们将字节表示转换为位,我们会得到:
01100001
2^0 + 2^5 + 2^6 = 97。很酷。
那么为什么 'a'.encode()
返回 b'a'
而不是 01100001
?
如果它没有特定的解释,它不应该返回类似b'01100001'
的东西吗?
它似乎像 ASCII 一样解释它。
有人提到它在字节串上调用 __repr__
,所以它以人类可读的形式显示。但是,即使我这样做:
with open('testbytestring.txt', 'wb') as f:
f.write(b'helloworld')
它会仍然将 helloworld
作为常规字符串插入文件,而不是作为字节序列... 那么 ASCII 中的字节字符串也是如此吗?
最佳答案
文本是 ASCII 或 UTF-8 或 Windows-1252 是一种常见的误解。 ,因此字节是文本。
文本只是文本,就像图像只是图像一样。将文本或图像存储到磁盘的问题是将数据编码为字节序列。将图像编码为字节的方法有很多:JPEG , PNG , SVG ,以及对文本、ASCII、UTF-8 或 Windows-1252 进行编码的许多方法。
一旦发生编码,字节就是字节。字节不再是图像;他们忘记了他们所指的颜色;尽管图像格式解码器可以恢复该信息。字节同样忘记了它们曾经的字母。事实上,字节根本不记得它们是图像还是文本。只有带外知识(文件名、媒体 header 等)才能猜测这些字节的含义,甚至可能是错误的(以防数据损坏)。
所以,在 Python (Python 3) 中,我们有两种可能看起来相似的类型;对于文本,我们有 str
,它知道它是文本;它知道它应该表示哪些字母。它不知道可能是哪些字节,因为字母不是字节。我们还有 bytestring
,它不知道是文本还是图像或任何其他类型的数据。
这两种类型表面上是相似的,因为它们都是事物的序列,但是它们序列的事物却大不相同。
在实现上,str
以 UCS-?
的形式存储在内存中,其中 ?是实现定义的,它可能是 UCS-4,UCS-2或 UCS-1,取决于编译时选项和 code points存在于表示的字符串中。
“但是为什么”?
有些看起来像文本的东西实际上是用其他术语定义的。一个非常好的例子是世界上的许多互联网协议(protocol)。例如,HTTP 是一个“文本”协议(protocol),实际上是使用 ABNF 定义的。 RFC 中常见的语法s。这些协议(protocol)以八位字节而不是字符表示,尽管也可以建议使用非正式的编码:
Rules resolve into a string of terminal values, sometimes calledcharacters. In ABNF, a character is merely a non-negative integer.In certain contexts, a specific mapping (encoding) of values into acharacter set (such as ASCII) will be specified.
这个区别很重要,因为不可能通过互联网发送文本,你唯一能做的就是发送字节。说“text but in 'foo' encoding”会使格式变得复杂得多,因为客户端和服务器现在需要以某种方式自行找出编码业务,希望以同样的方式,因为它们最终必须以字节的形式传递数据反正。这是双重无用的,因为无论如何这些协议(protocol)很少涉及文本处理,并且只是为实现者提供便利。服务器所有者和最终用户都不会对阅读 Transfer-Encoding: chunked
这个词感兴趣,只要服务器和浏览器都正确理解它。
相比之下,在处理文本时,您并不真正关心它是如何编码的。除了“Heδvy Mλtal άmlaόts”之外,你可以用任何你喜欢的方式表达“Heävy Mëtal Ümlaüts”
因此,不同的类型为您提供了一种表达“此值'表示'文本”或“字节”的方式。
关于python - 什么是 Python 字节串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22824539/
我正在尝试创建一个程序,其中字符串的前三个字符重复给定次数,如下所示: foo('Chocolate', 3) # => 'ChoChoCho' foo('Abc', 3) # => 'AbcAbcA
我有以下字符串: std::string str = "Mode:AAA:val:101:id:A1"; 我想分离一个位于 "val:" 和 ":id" 之间的子字符串,这是我的方法: std::st
DNA 字符串可以是任意长度,包含 5 个字母(A、T、G、C、N)的任意组合。 压缩包含 5 个字母(A、T、G、C、N)的 DNA 字母串的有效方法是什么?不是考虑每个字母表 3 位,我们可以使用
是否有一种使用 levenstein 距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配的好方法? 例子: str1='aaaaa' str2='bbbbbbaabaabbbb' if str
使用 OAuth 并使用以下函数使用我们称为“foo”(实际上是 OAuth token )的字符串加密 key public function encrypt( $text ) { // a
我是一名优秀的程序员,十分优秀!