文件转十六进制出现转义字符直接通过ASCII码逐字符展开的问题与修复
近日工作中遇到某品牌电子签章系统生成的PDF文件若直接使用十六进制查看器打开,会出现转义字符被直接以ASCII编码转换为16进制字符串的问题,导致提取的文件无法匹配ASN.1格式,无法进一步对签章有效性进行检查。如下图:

如果感觉不太理解,可以查阅ASCII码表,表中对转义字符有特定的对应编码,若直接挨个字符进行解码,就会出现一个字节被转换为两个字节且丢失原本的信息。

针对这个问题,建议通过编写脚本的方式对错误转码的十六进制字符串进行修正,只需要通过一次遍历即可。实现关键代码如下:
def process_hex_escape(input_hex):
escape_map = {
'66': '0C', # \f
'62': '08', # \b
'6E': '0A', # \n
'72': '0D', # \r
'74': '09', # \t
'5C': '5C', # \\
'76': '0B', # \v
'61': '07' # \a
}
input_hex = input_hex.upper()
result = []
i = 0
length = len(input_hex)
while i < length:
if i + 2 <= length and input_hex[i:i + 2] == '5C': #检测到5c(反斜杠)
if i + 4 <= length:
next_two = input_hex[i + 2:i + 4] #提取反斜杠后两字符
if next_two in escape_map: #若与替换表匹配
result.append(escape_map[next_two]) #向结果字符串插入替换后的字符
i += 4 #跳过5c和其之后的两字符
continue
i += 2 #未成功匹配则只跳过5c(删除单个的反斜杠)
else:
result.append(input_hex[i:i + 2] if i + 2 <= length else input_hex[i]) #没有5c则直接将原字符串两位插入结果字符串
i += 2
return ''.join(result)
通过同事交流、实际操作,我们发现不通过脚本而使用文本查看工具进行批量替换是操作繁琐且容易出错的,因为这个问题替换的优先级是出现在前面的字符优先替换,替换后的字符不再参与替换。再加上存在5C5C被替换为5C的情况,若进行批量替换操作不当易出现多换结果:
如:5C5C66——>5C66
5C66——>0C
通过脚本转换后生成的16进制字符串,通过十六进制编辑器输入新文件后,即可通过ASN.1工具进行解析,开展下一步工作了。
文件转十六进制出现转义字符直接通过ASCII码逐字符展开的问题与修复的更多相关文章
- 创建文件夹并解决解决unicode和ASCII码转换的问题
# -*- coding: UTF-8 -*-import sysimport timeimport os #解决unicode和ASCII码转换的问题reload(sys) #解决unicode和A ...
- shell 脚本文件十六进制转化为ascii码代码
十六进制的A转化为十进制ASCII码: 1 printf "%d\n" "'A" 十六进制的A转化为十六进制ASCII码: 1 printf "%x\ ...
- shell 脚本文件十六进制转化为ascii码代码, Shell中ASCII值和字符之间的转换
Shell中ASCII值和字符之间的转换 1.ASCII值转换为字符 方法一: i=97 echo $i | awk '{printf("%c", $1)}' ...
- sort将文件的每一行作为一个单位按ASCII码值进行比较
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...
- Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换
public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...
- 用正则怎么将html文件中文字取出进行ASCII码转换?
用正则怎么将html文件中文字取出?今天碰到这个问题,思来想去尝试了好几种方法,历经一阵头脑风暴,最后终于还是解决了,想想还是来记录一下.一共定义了三个函数,包含正则切割.正则判断对象开头.ASCII ...
- C# 把十六进制表示的ASCII码转换为对应的字符组成的字符串
0x30表示字符‘0’的ASCII码.
- C# ASCII码的转换、转义字符、对照表
var splitStr = new byte[] { 0x05, 0x0D, 0x0A };//var splitStr = new byte[] { 5, 13, 10 };这样写也可以 var ...
- (转)ASCII码对照表—在线工具
原文:https://www.sojson.com/asciitable.html 最全的ASCII码对照表--------https://blog.csdn.net/jinduozhao/artic ...
- php与ascii码
首先 简单说一下历史,ascii码最开始是美国人搞出来的,用来干什么呢?我们知道,计算机只知道0和1,如果我们要计算机识别除了01之外的字符,例如 'a',我们要先告诉计算机‘1100001’就是'a ...
随机推荐
- Qt音视频开发19-海康sdk录像存储
一.前言 关于调用海康sdk来进行录像存储,整体的框架架构处理流程沿袭了之前vlc内核.ffmpeg内核.mpv内核的做法,定时存储这块,开个定时器判断,到了时间则先关闭原来的录像存储,然后在开始一个 ...
- 如何使用vs将现有的项目或者文件夹(尤其是多层目录的)添加到项目中
在Visual Studio中将现有的项目或者文件夹(尤其是多层目录的)添加到项目解决方案中,步骤如下: 1.将现有项目或文件夹拷贝到指定目录下: 2.解决方案右上有个显示所有文件的按钮,如下图所示: ...
- IM跨平台技术学习(七):得物基于Electron开发客服IM桌面端的技术实践
本文由得物技术团队Uni分享,即时通讯网收录时有内容修订和排版优化. 一.引言 本文要分享的是得物技术团队基于Electron开发客服IM桌面端的技术实践过程,内容包括桌面技术选型.Electron的 ...
- spark (六) RDD算子(operator)
目录 1 转换算子(transformer)(将旧的RDD包装成新RDD) 1.1 单值类型 1.1.1 map 1.1.2 mapPartition 1.1.3 mapPartitionsWithI ...
- Yano 的 2024 观影总结
前言 2024 年马上就要过去了,总结下自己在 2024 年看过的影视作品. PS:我是用 Cursor 写的,所有有一些文字可能是 Cursor 自动补全的,不是我写的 0_o 电影 <怪物& ...
- linux-杂项
1.常用基础 防火墙systemctl status firewalldsystemctl stop firewalldsystemctl start firewalld find / -size + ...
- sql注入学校后台
有运气成分,遇到两个学校,子域名查询了一下发现有登录平台,然后就直接sql了 payload:admin'or 1=1--+ 很离谱,这年头这两学校还能直接被sql进入后台. 然后进学校后台后就可以直 ...
- h5使用vue-photo-preview 做全屏预览
h5页面使用全屏预览 最近需要在微信小程序中跳转到h5页面 在h5页面中需要进行图片预览展示 由于没有使用第三方的组件库. 只能手写,但是时间很紧张. 所以只能够寻找第三方的插件 vue-photo- ...
- linux mint安装触控板手势fusuma
安装必要的包,终端输入: sudo apt-get install libinput-tools sudo apt-get install xdotool sudo gem install fusum ...
- 深度学习中CUDA环境安装教程
首先说明,本人是小白,一次安装,可能有不对的地方,望包含. 安装CUDA 因为我们是深度学习,很多时候要用到gpu进行训练,所以我们需要一种方式加快训练速度. 通俗地说,CUDA是一种协助" ...