当前位置: 首页 > article >正文

Vim查看文件十六进制方法

在 Vim 中查看文件的十六进制格式,可以通过以下步骤实现:

方法 1:使用内置命令(无需插件)

  1. 用 Vim 以二进制模式打开文件

    vim -b 文件名
    

    或打开文件后执行:

    :set binary
    
  2. 转换为十六进制视图

    :%!xxd
    
    • 这会调用 xxd 工具(Vim 自带)将二进制内容转为十六进制格式显示。
  3. 返回正常模式(编辑后需转换回原始格式):

    :%!xxd -r
    

方法 2:使用快捷键插件(推荐)

  1. ~/.vimrc 中添加配置
    " 按 <F4> 在十六进制/文本模式间切换
    nnoremap <F4> :call ToggleHex()<CR>function! ToggleHex()if !exists("b:hex_mode") || !b:hex_mode:%!xxdlet b:hex_mode = 1else:%!xxd -rlet b:hex_mode = 0endif
    endfunction
    
    • 保存后重启 Vim,打开文件后按 <F4> 即可切换视图。

方法 3:使用专用插件(如 hexmode

  1. 安装插件(通过插件管理器,如 vim-plug):

    Plug 'fidian/hexmode'
    
  2. 使用命令切换视图

    :Hexmode  " 进入十六进制模式
    :Hexmode! " 返回文本模式
    

操作示例:

  1. 打开文件:

    vim -b test.bin
    
  2. 执行 :%!xxd 后显示效果:

    00000000: 4865 6c6c 6f20 576f 726c 6421 0a         Hello World!.
    
    • 左侧:字节偏移量(如 00000000
    • 中间:十六进制字节(每 2 字符为 1 字节)
    • 右侧:ASCII 可显示字符(. 表示不可见字符)
  3. 编辑后需用 :%!xxd -r 转换回二进制再保存!

⚠️ 注意:直接修改十六进制内容可能破坏文件结构,建议操作前备份!


您的问题非常到位!%!xxd 确实是 Vim 中处理二进制/十六进制的核心技巧,让我详细解释这个命令的每个部分和工作原理:


%!xxd 命令分解:

  1. % - 范围标识符
    代表 整个文件(从第一行到最后一行)。
    Vim 中其他常用范围:

    • 10,20:第 10 行到第 20 行
    • .:当前行
    • $:最后一行
  2. ! - 过滤器操作符
    表示 将选定文本通过外部命令过滤(类似 Unix 的管道 |)。

  3. xxd - 十六进制转换工具
    Vim 内置的二进制工具(Linux/macOS 系统也自带),专门用于:

    • 将二进制 → 十六进制(xxd
    • 将十六进制 → 二进制(xxd -r

执行流程:

Vim 缓冲区
%!xxd
xxd 程序
转换后的十六进制数据
替换回 Vim 缓冲区
  1. Vim 将当前文件内容 作为标准输入 发送给 xxd
  2. xxd 将接收到的二进制数据转换为十六进制格式
  3. xxd 的输出结果 替换 原文件内容

为什么必须用 ! 而不用直接执行?

  • xxd 需要原始二进制输入
    直接执行 :!xxd 会启动新 shell 进程,无法获取 Vim 缓冲区内容
  • ! 实现了管道机制
    相当于在终端执行:cat 当前文件 | xxd > 临时文件,然后 Vim 加载该临时文件
  • 保持编辑状态
    转换后直接在当前缓冲区操作,无需重新打开文件

关键注意事项:

  1. 二进制模式必须开启
    执行前需先运行 :set binary,否则 Vim 会自动转换换行符(LF ↔ CRLF),破坏二进制数据。

  2. 编辑后的还原
    修改十六进制内容后,必须用 :%!xxd -r 转换回二进制格式再保存,否则文件将包含十六进制文本。

  3. 偏移量说明
    xxd 生成的格式:

    00000000: 4865 6c6c 6f20 576f 726c 6421 0a         Hello World!.
    
    • 00000000:字节偏移量(16进制)
    • 中间部分:每 2 字符代表 1 字节的十六进制值
    • 右侧:ASCII 可视化表示(. 表示不可打印字符)

类比理解:

Vim 命令等效终端命令功能
:%!xxdcat file | xxd二进制→十六进制
:%!xxd -rcat file | xxd -r十六进制→二进制
:10,20!xxdsed -n '10,20p' file | xxd仅转换第10-20行

实际案例:

  1. 查看二进制文件

    vim -b demo.bin  " 以二进制模式打开
    :%!xxd           " 转换为十六进制视图
    
  2. 修改并保存

    /4865            " 查找字节 48 65 (对应 "He")
    :s/4865/5945/g   " 替换为 59 45 (变成 "Ye")
    :%!xxd -r        " 转换回二进制
    :wq              " 保存退出
    

这样文件开头的 “Hello” 就被改成了 “Yello”。

理解了这个机制,您就掌握了 Vim 中处理二进制数据的核心能力!


您提出了一个非常关键的问题!直接使用 vim file 而不加 -b 参数是不安全的,原因如下:


为什么必须用 vim -b:set binary

  1. 换行符自动转换问题

    • Vim 默认会根据系统环境自动转换换行符(如 LF ↔ CRLF)
    • 二进制文件中的 0x0A (LF) 和 0x0D (CR) 会被错误转换
    • 结果:文件内容被破坏!
  2. 字符编码问题

    • Vim 会尝试用当前编码(如 UTF-8)解释二进制数据
    • 可能导致非法字节序列被替换为 (U+FFFD)
  3. 文件结尾处理

    • Vim 默认会在文件末尾添加换行符(如果不存在)
    • 二进制文件大小会被改变

对比实验(危险!请勿在生产环境尝试)

  1. 创建测试文件

    echo -ne "Hello\x00World\xff" > test.bin
    
  2. 错误方式打开

    vim test.bin  # 不加 -b 参数
    
    • 执行 :%!xxd 后可能看到:
      00000000: 4865 6c6c 6f00 576f 726c 64ff       Hello.World.�
      
    • 实际文件已被修改:Vim 自动添加了换行符,0xff 被显示为非法字符
  3. 正确方式打开

    vim -b test.bin
    
    • 执行 :%!xxd 后:
      00000000: 4865 6c6c 6f00 576f 726c 64ff       Hello.World.
      
    • 文件内容保持原样

紧急补救方案

如果您已经用普通方式打开了二进制文件:

  1. 立即执行

    :set binary   " 停止进一步破坏
    :e!           " 放弃修改重新加载
    
  2. 检查是否已损坏

    :!cmp original.bin %  " 比较文件是否相同
    
  3. 如果已修改

    :q!           " 不保存退出
    vim -b file   " 重新用二进制模式打开
    

为什么 :set binary 能解决问题?

这个命令会同时设置三个关键选项:

:set binary     " 等价于:
:set bin        " 缩写
:set noeol      " 不在文件末尾添加换行符
:set nofixeol   " 不"修复"行尾
:set nobomb     " 不添加UTF-8 BOM
:set textwidth=0
:set wrapmargin=0
:set encoding=latin1 " 使用单字节编码

最佳实践总结

操作风险等级推荐度
vim -b file⚠️ 无风险★★★★★
vim file + :set binary⚠️ 打开时可能有轻微风险★★★☆☆
vim file 直接操作☢️ 高风险★☆☆☆☆

结论:对于二进制文件,必须使用 vim -b 或在打开后立即执行 :set binary,否则文件可能被不可逆损坏!

相关文章:

Vim查看文件十六进制方法

在 Vim 中查看文件的十六进制格式&#xff0c;可以通过以下步骤实现&#xff1a; 方法 1&#xff1a;使用内置命令&#xff08;无需插件&#xff09; 用 Vim 以二进制模式打开文件&#xff1a; vim -b 文件名或打开文件后执行&#xff1a; :set binary转换为十六进制视图&…...

电脑提示dll文件缺失怎么办 dll修复方法

当你在使用某些应用程序或启动电脑时&#xff0c;看到提示“DLL文件缺失”的错误信息&#xff0c;这通常意味着某个必要的动态链接库&#xff08;DLL&#xff09;文件无法被找到或加载&#xff0c;导致软件无法正常运行。本文将详细介绍如何排查和修复DLL文件缺失的问题&#x…...

【自动思考记忆系统】demo (Java版)

背景&#xff1a;看了《人工智能》中的一段文章&#xff0c;于是有了想法。想从另一种观点&#xff08;⭕️&#xff09;出发&#xff0c;尝试编码&#xff0c;告别传统程序员一段代码解决一个问题的方式。下图是文章原文和我的思考涂鸦✍️&#xff0c;于是想写一个自动思考记…...

【AAOS】【源码分析】用户管理(二)-- 整体架构

整体介绍 Android多用户功能作为 Android Automotive 的重要组成部分,为不同驾驶员和乘客提供了一个更加定制化、隐私保护的使用环境。Android 多用户的存在,它可以让多个用户使用同一台设备,同时保持彼此的数据、应用和设置分隔开来。 各用户类型的权限 能力SystemAdminS…...

51单片机基础部分——独立按键检测

前言 在单片机开发中&#xff0c;我们会经常对单片机的状态进行控制&#xff0c;比如我们会控制某个灯点亮&#xff0c;某个灯熄灭&#xff0c;这个时候我们就要开始做控制&#xff0c;我们可以通过什么控制呢&#xff0c;这个地方我们选择按键控制 按键实物及工作原理 生活…...

【Docker管理工具】部署Docker可视化管理面板Dpanel

【Docker管理工具】部署Docker可视化管理面板Dpanel 一、Dpanel介绍1.1 DPanel 简介1.2 主要特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Dpanel镜像五、部署Dpanel…...

Github 2025-06-02 开源项目周报 Top11

根据Github Trendings的统计,本周(2025-06-02统计)共有11个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6Jupyter Notebook项目2Shell项目1Dockerfile项目1TypeScript项目1Vue项目1PowerShell项目1MindsDB:定制企业数据人工智能的开源平台…...

springboot实现查询学生

文章目录 数据库前端 请求mybatis 数据库 前端 请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <a href"/list">启动学生管理…...

深入解析C++五大常用设计模式:原理、实现与应用场景

设计模式是解决特定软件设计问题的经典方案&#xff0c;掌握它们能显著提升代码的可维护性和扩展性。本文详细解析C中五种最常用的设计模式&#xff0c;附带完整代码示例和实战技巧。 一、设计模式概述 设计模式是面向对象编程中可复用的解决方案&#xff0c;它们源于工程师们…...

标识符Symbol和迭代器的实现

Symbol基础 Symbol("描述") 创建唯一标识符&#xff08;每次调用返回新值&#xff09; Symbol.for("key") 全局注册表模式&#xff08;相同key返回同一Symbol&#xff09; Symbol特性 作为对象属性键时&#xff1a;obj[SymbolKey] value不参与常规遍历&…...

Appium+python自动化(九)- 定位元素工具

简介 环境搭建好了&#xff0c;其他方面的知识也准备的差不多了&#xff0c;那么就开始下一步元素定位&#xff0c;元素定位主要介绍如何使用uiautomatorviewer&#xff0c;通过定位到页面上的元素&#xff0c;然后进行相应的点击等操作. 此外在介绍另一款工具&#xff1a;Insp…...

Unity 中实现可翻页的 PageView

之前已经实现过&#xff1a; Unity 中实现可复用的 ListView-CSDN博客文章浏览阅读5.6k次&#xff0c;点赞2次&#xff0c;收藏27次。源码已放入我的 github&#xff0c;地址&#xff1a;Unity-ListView前言实现一个列表组件&#xff0c;表现方面最核心的部分就是重写布局&…...

clickhouse常用语句汇总——持续更新中

一、查询判断是否包含指定列 1.根据数据库&#xff0c;表名查看表包含的列 SELECT name FROM system.columns WHERE table table_name AND database databasename;2.查找指定列target_column是否是表table_name的列 SELECT count() > 0 AS column_exists FROM system…...

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】 目录 云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】1.RPM包的一般安装位置2.软件名和软件包名3.查询软件信息4.查询软件包5.导入红帽签名信息&#xff0c;解决查询软件包信息报错6.利用…...

LuaJIT2.1 和 Lua5.4.8 性能对比

说明 最近在学习 LuaJIT&#xff0c;想看看把它接入到项目中使用&#xff0c;会提高多大的性能。 今天抽时间&#xff0c;简单地测试了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 测试平台&#xff1a; 系统&#xff1a;Windows 10 WSLCPU&#xff1a;Intel Core™ i7-8700 CPU…...

深度学习姿态估计实战:基于ONNX Runtime的YOLOv8 Pose部署全解析

本文将详细介绍如何脱离YOLO官方环境&#xff0c;使用ONNX Runtime部署YOLOv8姿态估计模型。内容包括模型加载、图像预处理&#xff08;Letterbox缩放和填充&#xff09;、推理执行、输出解码&#xff08;边界框和关键点处理&#xff09;、非极大值抑制&#xff08;NMS&#xf…...

深度探索:如何用DeepSeek重构你的工作流

前言:AI时代的工作革命 在人工智能浪潮席卷的今天,DeepSeek作为国产大模型的代表之一,正以其强大的自然语言处理能力、代码生成能力和多模态交互特性,重新定义着人类的工作方式。根据IDC报告显示,2024年企业级AI应用市场规模已突破800亿美元,其中智能办公场景占比达32%,…...

深入解析与解决方案:处理Elasticsearch中all found copies are either stale or corrupt未分配分片问题

目录 引言 1 问题诊断深入分析 1.1 错误含义深度解析 1.2 获取详细的诊断信息 2 解决方案选择与决策流程 2.1 可用选项全面对比 2.2 推荐处理流程与决策树 3 具体操作步骤详解 3.1 优先尝试 - 分配最新副本&#xff08;最低风险&#xff09; 3.2 中等风险方案 - 分配…...

【NLP 78、手搓Transformer模型结构】

你以为走不出的淤泥&#xff0c;也迟早会云淡风轻 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》这篇论文可以说是自然语言处理领域的一座里程碑&#xff0c;它提出的 Transformer 结构带来了一场技术革命。 研究背景与目标 在 Transfo…...

yum更换阿里云的镜像源

步骤 1&#xff1a;备份原有源配置&#xff08;重要&#xff01;&#xff09; sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/步骤 2&#xff1a;下载阿里云源配置 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https:…...

如何自定义WordPress主题(5个分步教程)

如果您已经安装了一个 WordPress 主题&#xff0c;但它不太适合您&#xff0c;您可能会感到沮丧。在定制 WordPress 主题方面&#xff0c;您有很多选择。 挑战在于找到正确的方法。 在本篇文章中&#xff0c;我将引导您了解自定义 WordPress 主题的各种选项&#xff0c;帮助您…...

ios版本的Tiktok二次安装不上,提示:Unable to Install “TikTok”

问题&#xff1a;Domain: IXUserPresentableErrorDomain Code: 1 Recovery Suggestion: Failed to load Info.plist from bundle at path /private/var/containers/Bundle/Application/E99D86D4-F96E-48F9-86C5-FE095A22E13A/DouyinDev.app/PlugIns/AwemeNotificationService.a…...

react实现markdown文件预览

文章目录 react实现markdown文件预览1、实现md文件预览2、解决图片不显示3、实现效果 react实现markdown文件预览 1、实现md文件预览 1️⃣第一步&#xff1a;安装依赖&#xff1a; npm install react-markdown remark-gfmreact-markdown&#xff1a;将 Markdown 渲染为 Rea…...

Neo4j 认证与授权:原理、技术与最佳实践深度解析

Neo4j 作为领先的图数据库,其安全机制——认证(Authentication)与授权(Authorization)——是保障数据资产的核心防线。本文将深入剖析其工作原理、关键技术、实用技巧及行业最佳实践,助您构建坚不可摧的图数据安全体系。 Neo4j 提供了强大且灵活的认证授权框架,涵盖从基…...

Android Studio 配置之gitignore

1.创建或编辑.gitignore文件 在项目根目录下检查是否已有.gitignore文件。如果没有&#xff0c;创建一个新文件&#xff0c;命名为.gitignore&#xff08;注意文件名前有个点&#xff09;。 添加忽略规则&#xff1a;在.gitignore中添加以下内容&#xff1a; 忽略整个 .idea …...

PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小

PDF 的页面大小决定了其内容的显示、打印或处理方式。我们通常在准备打印、转换格式或标准化布局时需要更改 PDF 页面大小。在本文中&#xff0c;您将学习如何使用 C# 更改任何 PDF 文件的页面大小。我们将通过完整的代码示例&#xff0c;逐步指导您完成操作。 Aspose.PDF最新…...

Perl One-liner 数据处理——基础语法篇【匠心】

Perl(Practical Extraction and Report Language)是一种功能强大且灵活的脚本语言,因其强大的文本处理能力和简洁的语法而广受开发者和系统管理员的喜爱。特别是在命令行环境下,Perl 的 one-liner(单行脚本)以其高效、简洁的特点,成为数据处理、文本转换和快速原型设计的…...

PHP 打印扩展开发:从易联云到小鹅通的多驱动集成实践

目前已有易联云WIFI打印机扩展 扩展入口文件 文件目录 crmeb\services\printer\Printer.php namespace crmeb\services\printer;use crmeb\basic\BaseManager; use think\facade\Config; use think\Container;/*** Class Printer* package crmeb\services\auth* mixin \crme…...

rust或tauri项目执行命令的时候,cmd窗口也会弹出显示解决方法

阻止 Tauri 执行命令时弹出 CMD 窗口 当你在 Tauri 中使用 tokio::process::Command 执行命令时弹出 CMD 窗口&#xff0c;这是因为 Windows 默认会为控制台程序创建可见窗口。以下是几种解决方法&#xff1a; 1. 使用 Windows 特有的创建标志 (推荐) #[tauri::command] pub…...

[软件工程] 文档 | 技术文档撰写全流程指南

技术文档撰写全流程指南 一份优秀的技术文档需平衡 “技术严谨性” 与 “用户友好性”&#xff0c;其本质是降低信息传递成本&#xff0c;让读者能快速获取所需信息&#xff0c;减少沟通与试错成本。在实际操作中&#xff0c;从明确目标、结构化内容、可视化表达&#xff0c;到…...