如何在 Python 中写入原始二进制数据?

2024-03-19

我有一个 Python 程序,可以存储数据并将数据写入文件。数据是原始二进制数据,内部存储为str。我正在通过 utf-8 编解码器将其写出来。但是,我得到UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 25: character maps to <undefined> in the cp1252.py file.

在我看来,Python 正在尝试使用默认代码页解释数据。但事实并非如此have默认代码页。这就是我使用的原因str, not unicode.

我想我的问题是:

  • 如何在 Python 中表示内存中的原始二进制数据?
  • 当我通过编解码器写入原始二进制数据时,如何对其进行编码/取消编码?

注意:这是为 Python 2.x 编写的。不确定是否适用于 3.x。

您的使用str对于内存中的原始二进制数据是正确的。
[如果您使用的是Python 2.6+,则更好使用bytes在 2.6+ 中它只是一个别名str但更好地表达了您的意图,并且如果有一天您将代码移植到 Python 3,将会有所帮助。]

正如其他人指出的那样,通过编解码器写入二进制数据很奇怪。写编解码器采用 unicode and 输出字节到文件中。你试图倒退,因此我们对你的意图感到困惑......

[并且您对错误的诊断看起来是正确的:由于编解码器需要 unicode,Python 正在使用系统的默认编码将您的 str 解码为 un​​icode,这令人窒息。]

您想在输出文件中看到什么?

  • 如果文件应按原样包含二进制数据:

    那么你一定不能通过编解码器发送它;你必须写它 直接到文件。编解码器编码一切并且只能 发出有效的 unicode 编码(在您的情况下,有效的 UTF-8)。 没有任何输入可以让它发出任意信号 字节序列!

    • 如果您需要一个mixtureUTF-8 和原始二进制数据,您 应该直接打开文件,并混合写入some_data with some_text.encode('utf8')...

    但请注意,将 UTF-8 与原始任意数据混合是非常危险的。 设计不好,因为这样的文件处理起来很不方便 和!理解 unicode 的工具会因二进制文件而卡住 数据,让您甚至无法方便地查看(更不用说 修改)文件。

  • 如果您想要任意字节的友好表示 统一码:

    Pass data.encode('base64')到编解码器。 Base64 只产生 干净的ascii(字母、数字和一点标点符号)所以它 可以清楚地嵌入到任何东西中,它在人们看来显然是 二进制数据,而且相当紧凑(略高于 33% 高架)。

    附:你可能会注意到data.encode('base64')很奇怪。

    • .encode()应该采用 unicode 但我给它一个 细绳?! Python 有几个伪编解码器可以将 str->str 转换 例如“base64”和“zlib”。

    • .encode()总是返回一个 str 但你会将其输入编解码器 期待统一码?!在这种情况下,它只会包含干净的 ascii,所以没关系。你可以明确地写data.encode('base64').encode('utf8')如果它让你感觉 更好的。

  • 如果您需要从任意字节到 unicode 的 1:1 映射:

    Pass data.decode('latin1')到编解码器。latin1地图 字节 0-255 到 unicode 字符 0-255,这有点优雅。

    当然,编解码器会对您的字符进行编码 - 128-255 是 以 UTF-8 编码为 2 或 3 个字节(令人惊讶的是,平均 开销是 50%,比 base64 还多!)。这相当杀死 1:1 映射的“优雅”。

    另请注意,unicode 字符 0-255 包括令人讨厌的字符 不可见/控制字符(换行符、换页符、软连字符等) 使您的二进制数据在文本编辑器中查看起来很烦人。

    考虑到这些缺点,我不推荐拉丁1除非 你完全明白为什么你想要它。
    我只是将其称为另一种“自然”编码 去提醒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 中写入原始二进制数据? 的相关文章

随机推荐

  • 使用字符串中的名称获取变量的值

    我想从变量的名称中获取其值 澄清一下 XML 文档以字符串形式提供变量名称 我想获得价值 像这样的东西 string bublegumA strawberry string bubblegumB banana get which varia
  • 将基于视图的 NSOutlineView 绑定到 Core Data

    我正在尝试将新的基于视图的 OutlineView 实现为我的 Mac 应用程序中的源列表 不过 我无法获取要显示的值 因此我从核心数据应用程序模板制作了一个小型测试应用程序 但也无法让它在其中正常工作 我在数据模型中定义了两个简单的类 我
  • 在 null 上调用成员函数 store() - laravel 5.4

    我正在尝试上传图像 但每次提交时都会返回 store 错误 我已将表单设置为 enctype multipart form data 这没有帮助 有人能指出我正确的方向吗 Thanks 控制器内部功能 public function sto
  • 来自 Android 的 Facebook Score API 调用未在时间轴/股票代码上显示高分

    我正在尝试让 Android 应用程序将高分发布到 Facebook 类似于 Facebook 上的 愤怒的小鸟 的做法 它显示在时间轴上 也显示在股票代码中 请记住 该游戏仅在 Android 上运行 并且没有 FB Canvas 应用程
  • GiST 和 GIN 索引之间的区别

    我正在实现一个表 其中有一列的数据类型为tsvector我想了解什么索引更好使用 GIN 还是 GiST 在浏览中postgres 文档在这里 http www postgresql org docs 9 1 static textsear
  • 模拟安全警报的解决方案 - X509TrustManager 的不安全实现

    因此 最近我在开发人员控制台中收到以下警告 为了解决该问题 我已完成了所需的修复 根据谷歌的建议 here https support google com faqs answer 6346016 要确认您已进行正确的更改 请将应用程序的更
  • CouchDB 备份和克隆数据库

    我们正在寻找 CouchdDB 作为类似 CMS 的应用程序 围绕备份我们的生产数据库有哪些常见模式 最佳实践和工作流程建议 我对克隆数据库以用于开发和测试的过程特别感兴趣 仅从实时运行的实例下复制磁盘上的文件就足够了吗 您可以在两个实时运
  • TabLayout 使用自定义视图更新选项卡内容

    我在用着TabLayout新的材料设计 我有一个问题 创建选项卡后我无法更新自定义视图的选项卡内容 我可以用以下方法简化 PagerAdapter 中的方法 public View setTabView int position boole
  • 记录器服务错误:鼠标左键按下:无法找到匹配的元素 - Xcode 错误

    我正在尝试通过 XCTest 自动化我的 mac 应用程序 当尝试从 XCode 记录应用程序时 我收到以下错误消息 当我点击按钮时会发生这种情况 按钮层次结构是 按钮 gt 堆栈视图 gt NSView 这里 button是NSButto
  • 外键和索引问题

    我正在使用 SQL Server 2008 Enterprise 我有一个表 其中一个列引用另一个表 在同一个数据库中 中的另一列作为外键 这是相关的SQL语句 更详细地说 表 Foo 中的列 AnotherID 引用了另一个表表 Goo
  • 如何使用 sass 正确避免在 HTML 上嵌入 twitter bootstrap 类名

    我正在开发一个刚刚开始的 Rails 项目 我们想使用 twitter bootstrap 作为我们样式的基础 一开始我们只是直接在 HTML 代码上使用 bootstrap 的类名 就像 bootstrap 的文档中所示 但在阅读以下文章
  • 如何检查 Python 数组中是否存在某个元素(相当于 PHP in_array)?

    我是 Python 新手 我正在寻找一个标准函数来告诉我数组中是否存在某个元素 我找到了index方法 但如果未找到该元素 则会抛出异常 我只需要一些可以返回的简单函数true如果该元素在数组中或者false if not 基本上相当于 P
  • hook_user():将额外的字段插入数据库而不仅仅是表单

    我可以在注册中添加一个额外的字段 我需要知道的是我需要采取什么步骤来获取该输入并将其插入到 drupal 的用户表中 下面的代码位于我的模块中 它仅向表单添加一个字段 但是当提交时 它不会对数据执行任何操作 function perscri
  • 如何组合两个索引不同的 pandas 系列?

    我尝试将两个不同索引的系列组合在一起 相同的行数 我试过pd concat s1 s2 axis 1 例如 s1 为 index s1 0 1 5 1 2 s2 是 index s2 a 1 b 2 但我得到 index s1 s2 0 1
  • 批量从文本文件中删除重复行

    是否可以从文本文件中删除重复的行 如果是 怎么办 当然可以 但就像大多数批处理文本文件一样 它并不漂亮 而且不是特别快 该解决方案在查找重复项时忽略大小写 并对行进行排序 文件名作为第一个也是唯一一个参数传递给批处理脚本 echo off
  • 运行 jQuery 函数 onclick

    所以我实现了一些 jQuery 它基本上通过由滑块激活的滑块来切换内容 a 标签 现在考虑一下 我宁愿让保存链接的 DIV 本身就是链接 我正在使用的 jQuery 在我的脑海中看起来像这样 a
  • 用 jQuery 收集表单中的所有项目

    如何收集 jQuery 中的所有复选框和下拉列表项进行保存 或者 对于最新版本的 jquery 您可以使用 http docs jquery com Ajax serialize http docs jquery com Ajax seri
  • 如何解决DEP6500和DEP6701错误?

    我有一个项目叫BTLE在它自己的解决方案中 加载项目并使用手机上的调试器运行它可以找到 我有第二个解决方案 可以很好地加载和编译 我添加了BTLE项目 添加 现有项目 到第二个解决方案 编译它并尝试在调试器中运行它 我可以看到应用程序已正确
  • 使用 PIG 从 Hive 表解析嵌套 XML 字符串

    我正在尝试使用 PIG 从 Hive 表中的字段而不是从 XML 文件中提取一些 XML 这是我读过的大多数示例的假设 XML 来自排列如下的表 ID XML string XML 字符串包含 n 行 始终包含最多 10 个属性中的至少一个
  • 如何在 Python 中写入原始二进制数据?

    我有一个 Python 程序 可以存储数据并将数据写入文件 数据是原始二进制数据 内部存储为str 我正在通过 utf 8 编解码器将其写出来 但是 我得到UnicodeDecodeError charmap codec can t dec