使用字符串类编码二进制数据
Encoding binary data using string class
作为研究项目的一部分,我正在经历字符串实现的一个需求。
让我们假设标准库不存在,而我们专注于设计我们自己的字符串类。它将具有什么功能支持以及我们将改进哪些限制。让我们考虑一下以下因素。
- 二进制数据需要编码吗
- 多字节字符编码是可以接受的还是unicode是必需的
- C风格的函数可以用来提供一些所需的功能吗
- 需要什么类型的插入和提取操作
我对以上文本的问题
- 作者所说的"二进制数据需要编码吗?"是什么意思。请举例说明我们如何实现这一点
- 第二点作者的意思是什么。请举例说明我们如何实现这一点
谢谢你的时间和帮助。
关于第一点,"二进制数据"指的是字节序列,其中"字节"几乎总是指八位字。在过去,大多数系统都是基于ASCII的,它需要7位(或者8位,取决于你问谁)。因此,没有必要区分字节和字符。如今,我们对非英语使用者更加友好,因此我们必须处理Unicode(以及其他代码集)。这就提出了一个问题,即字符串类型需要处理字节和字符不再是一回事的事实。
这将转到第二点,这是关于如何在程序中表示字符串的问题。UTF-8使用可变长度编码,其显著特性是它使用与ASCII编码完全相同的字节来编码整个ASCII字符集。然而,这会使计算字符串中的字符数变得更加困难。对于纯ASCII,答案很简单:字符=字节。但是,如果你的字符串可能有非ASCII字符,你现在必须遍历字符串,解码字符,以找出有多少1。
这些都是在设计字符串类时需要考虑的问题。
1这并不像看上去那么困难,因为每个字符的第一个字节保证在其两个高位中没有10。因此,您可以简单地计算满足(c & 0xc0) != 0xc0
的字节数。尽管如此,相对于仅将字符串缓冲区的长度视为其字符计数而言,它仍然很昂贵。
-
这里的问题是"我们可以在字符串中存储任何旧数据吗,或者某些字节值是否需要以某种特殊的方式编码。例如,在标准C语言中,如果你想使用换行符,它是"编码的"作为
n
,使其更可读、更清晰-当然,在这个例子中,我指的是源代码。如果二进制数据存储在字符串中,你将如何处理"奇怪"的数据-例如,零字节呢?它们需要特殊处理吗? -
保证适合
char
的值是ASCII字符和其他一些字符(在典型的实现中总共有256个不同的字符,但char
不保证是标准的8位)。但如果我们以非欧洲语言为例,如汉语或日语,它们的数量远远高于单个char
中可用的语言。Unicode允许数百万个不同的字符,因此来自任何欧洲、中国、日本、泰国、阿拉伯、玛雅和古代象形文字的任何字符都可以用一个"单位"表示。这是通过使用更宽的字符来完成的——对于完整的大小,我们需要32位。这里的缺点是,大多数时候,我们实际上并没有使用那么多不同的字符,所以每个字符使用32位有点浪费,但几乎所有时间都是在高24位中使用零。
多字节字符编码是一种折衷方案,其中"常见"字符(在欧洲语言中常见)被用作一个char
,但不太常见的字符被编码为多个char
值,使用一个特殊的字符范围来表示"下一个char
中有更多的数据要组合成一个单元"。(或者,可以决定每次使用2、3或4个char
来编码单个字符)。
- 如何从dicom文件中读取二进制数据
- 如何在Qt中从数据库中检索二进制数据?
- readsome() 适合在 Windows 上读取二进制数据吗?
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 将包含二进制数据的 QByteArray 传递到按值运行
- 如何在 c++ 中生成十六进制二进制数据的 sha256 哈希?
- 在处理网络、二进制数据和序列化时应使用流或容器
- 我能确定从文件中读取的 32 字节二进制数据等于 256 位吗?
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- 使用二进制数据更新 PostgreSQL 表
- 使用二进制数据和无符号字符
- sd_journal_send发送二进制数据.如何使用日志检索数据?
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- 将文本和二进制数据连接到一个文件中
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 将整数的二进制数据转换为浮点数
- 使用 CMake 在可执行文件中嵌入二进制数据
- 二进制数据作为命令行参数
- 如何访问文件的二进制数据?
- 返回二进制数据的通用方式,而无需原始指针