近日工作中遇到某品牌电子签章系统生成的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. 解决STM32 CubeMX中配置RTC每次上电就会重置的问题

    自从有了Cube MX,配置STM32的外设就变得格外简单.不过这次差点踩坑,下载完程序后RTC自动就恢复到了我设置的初始值,重启之后现象依旧. 下面就以上问题简单分析一下代码. /* RTC ini ...

  2. CDS标准视图:技术对象类别文本 I_TechnicalObjectTypeText

    视图名称:技术对象类别文本 I_TechnicalObjectTypeText 视图类型:基础 视图代码: 点击查看代码 @EndUserText.label: 'Technical Object T ...

  3. .NET Core use NLog

    Nlog 实现了 Microsoft.Extensions.Logging.ILogger. 首先Nuget下载添加引用:NLog.Extensions.Logging 在添加NLog的配置文件&qu ...

  4. w3cschool-Netty 实战精髓篇1

    https://www.w3cschool.cn/essential_netty_in_action/ Netty 异步和数据驱动 2021-04-22 14:57 更新 在学习Netty的异步和数据 ...

  5. HashMap的底层实现原理? HashMap 和 Hashtable的异同? 负载因子值的大小,对HashMap有什么影响?

     1. HashMap的底层实现原理 HashMap的底层:数组+链表 (jdk7及之前) 数组+链表+红黑树 (jdk 8)HashMap的底层实现原理?以jdk7为例说明: HashMap map ...

  6. Dummynet简单部署

    本文分享自天翼云开发者社区<Dummynet简单部署>,作者:凸凹 部署流程 ^准备内核版本 ^参看系统内核版本 uname -r 我们需要将ipfw编译成内核模块,请确保ipfw用到的内 ...

  7. Java代码覆盖率工具之Jacoco

    Java代码覆盖率工具之Jacoco JaCoCo(Java Code Coverage)是一款面向Java语言的开源代码覆盖率工具,以其小型化和轻量化著称.它能够提供代码在测试过程中的覆盖率信息,帮 ...

  8. linux mint安装触控板手势fusuma

    安装必要的包,终端输入: sudo apt-get install libinput-tools sudo apt-get install xdotool sudo gem install fusum ...

  9. Docker部署 .Net程序

    项目准备   首先创建一个项目,这里准备的是api项目,当然也可以是其他项目,按照自己需要的项目创建即可: 添加Dockerfile   接下来添加Dockfile文件,Dockerfile文件是Do ...

  10. MacOS配置Homebrew

    Homebrew笔记 1. 介绍 官网:https://brew.sh/ 对于习惯了使用命令来完成一切的程序员来说,安装软件这种小事,自然是能够用命令解决,就不用图形界面选择.但是在 Linux 中, ...