近日工作中遇到某品牌电子签章系统生成的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码逐字符展开的问题与修复的更多相关文章

  1. 创建文件夹并解决解决unicode和ASCII码转换的问题

    # -*- coding: UTF-8 -*-import sysimport timeimport os #解决unicode和ASCII码转换的问题reload(sys) #解决unicode和A ...

  2. shell 脚本文件十六进制转化为ascii码代码

    十六进制的A转化为十进制ASCII码: 1 printf "%d\n" "'A" 十六进制的A转化为十六进制ASCII码: 1 printf "%x\ ...

  3. shell 脚本文件十六进制转化为ascii码代码, Shell中ASCII值和字符之间的转换

    Shell中ASCII值和字符之间的转换     1.ASCII值转换为字符        方法一: i=97 echo $i | awk '{printf("%c", $1)}' ...

  4. sort将文件的每一行作为一个单位按ASCII码值进行比较

    1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...

  5. Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

    public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...

  6. 用正则怎么将html文件中文字取出进行ASCII码转换?

    用正则怎么将html文件中文字取出?今天碰到这个问题,思来想去尝试了好几种方法,历经一阵头脑风暴,最后终于还是解决了,想想还是来记录一下.一共定义了三个函数,包含正则切割.正则判断对象开头.ASCII ...

  7. C# 把十六进制表示的ASCII码转换为对应的字符组成的字符串

    0x30表示字符‘0’的ASCII码.

  8. C# ASCII码的转换、转义字符、对照表

    var splitStr = new byte[] { 0x05, 0x0D, 0x0A };//var splitStr = new byte[] { 5, 13, 10 };这样写也可以 var ...

  9. (转)ASCII码对照表—在线工具

    原文:https://www.sojson.com/asciitable.html 最全的ASCII码对照表--------https://blog.csdn.net/jinduozhao/artic ...

  10. php与ascii码

    首先 简单说一下历史,ascii码最开始是美国人搞出来的,用来干什么呢?我们知道,计算机只知道0和1,如果我们要计算机识别除了01之外的字符,例如 'a',我们要先告诉计算机‘1100001’就是'a ...

随机推荐

  1. Qt开源作品7-高亮按钮控件

    一.前言 这个高亮按钮控件并非本人原创作品,是参考的Qt界的一个大师级人物公孙二狗的作品,各位有兴趣可以去搜索查看,在原作者的代码上,我只是改成了自己的控件的框架结构,然后完善了一些细节,比如增加了各 ...

  2. Wfurent 语语法概述

    \[\textit{Litar!} \newcommand{\wd}[2]{\texttt{#1}^{#2}} \] 让神明白   文字产生于史前的祭祀,史前的人们改造了原始的语言规则,使得句子拥有& ...

  3. Java工具类HttpClientUtil

    1. 依赖包 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId> ...

  4. 外部H5唤起常用小程序链接规则整理

    概述 我目前工作是全职做小程序开发,所负责的小程序需要发布抖音+快手+微信+支付宝四端,年底了,公司准备做一波营销活动,营销活动更好传播的话首选H5活动营销页,这就需要考虑怎么把用户从H5页面引入到我 ...

  5. ASP.NET Core - 日志记录系统(二)

    本篇接着上一篇 [ASP.NET Core - 日志记录系统(一)] 往下讲,所以目录不是从 1 开始的. 2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括以下日志记 ...

  6. net core 中的[FromBody]

    一.针对.net core中post类型的api注意的地方(前提是Controller上加[ApiController]特性).默认是这个. 1.如果客户端Content-Type是applicati ...

  7. SpringCloud与Dubbo的区别

    1.SpringCloud与Dubbo的区别两者都是现在主流的微服务框架,但却存在不少差异: 初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案:Dubbo 是 SOA 时代的产物 ...

  8. Swagger介绍和应用

    1.什么是swaggerSwagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.简单来说,Swagger是一个功能强大的接口管理工具,并且提供了多种编程语言的 ...

  9. Elasticsearch(3)--- Docker容器中运行ES、Kibana、Cerebro

    想加强ES有关的知识,看了阮一鸣老师讲的<Elasticsearch核心技术与实战>收获很大,所以接下来会跟着他来更加深入的学习ES. 这篇博客的目的就是部署好ES和跟ES相关的辅助工具, ...

  10. ffmpeg简易播放器(3)--使用ffmpeg解码视频并用opencv显示视频

    ffmpeg的安装 这里我采用的linux下编译源码的方式安装ffmpeg,当然也可以使用apt-get等方式安装,但是我当时使用apt-get安装的ffmpeg使用cmake总是找不到ffmpeg的 ...