python 单反格式转格式_python input()键盘输入8583报文带有\x单反斜杠自动转义问题解决办法...

博客探讨了在Python中使用`input()`函数输入8583报文字符串时,遇到的单反斜杠被自动转义成双反斜杠的问题。通过在键盘输入时使用`decode("unicode_escape")`解决了这个问题,确保输入的8583报文不受转义影响。
摘要由CSDN通过智能技术生成

用input()输入的字符串是8385报文比如:\x30\x30\x30\x30。。。,但是输入后,代码把8583报文字符串中多加了一个\,类似\\x30。

但是我把input()代码注释掉,把8583报文在变量中写死,就没有这个问题,我想应该是编码问题造成的。

input输入和变量固定,难道还有什么不一样吗?

代码如下:

输入的单反斜杠,被系统自动转义双反斜杠\\x,代码中增加了依据判断:

if "\\x" in input_a1:

在input()键盘输入时,增加decode("unicode_escape")解决了问题。

代码如下:

#coding:utf-8

#固定8583报文16进制数据

a = "\x31\x31\x39\x39\x30\x36\x30\x30\x30\x32\x30\x30"

print(type(a))

print(a)

b = str(a)

print("变量-->%s"%b)

#通过键盘复制的8583报文16进制数据

#\x31\x31\x39\x39\x30\x36\x30\x30\x30\x32\x30\x30

input_a = raw_input("输入1—>:").decode("unicode_escape")

if "\\x" in input_a:

print("输入的单反斜杠,被系统自动转义双反斜杠\\x")

else :

print("使用unicode_escape存储内存值方法,输入的8583报文单反斜杠没有被转义")

print(type(input_a))

b = str(input_a)

print("键盘-->%s"%b)

#查问题

input_a1 = raw_input("输入2—>:")

if "\\x" in input_a1:

print("输入的单反斜杠,被系统自动转义双反斜杠\\x")

else :

print(type(input_a))

b = str(input_a)

print("键盘-->%s"%b)

百度了一些资料,我们数据字符串通常都是str、unicode类型,基本上都是采用直接存储的的方式,还有一种存储方式是按字符串的内存编码值进行存储,它在读取字符串的时候再反转回来。

>>> u'中文测试'.encode('unicode-escape')

'\\u4e2d\\u6587\\u6d4b\\u8bd5'

>>> '\\u4e2d\\u6587\\u6d4b\\u8bd5'.decode('unicode-escape')

u'\u4e2d\u6587\u6d4b\u8bd5'

Python模拟键盘输入和鼠标操作

Python模拟键盘输入和鼠标操作 一.Python键盘输入模拟: import win32api import win32con win32api.keybd_event(17,0,0,0)  #c ...

Python读取键盘输入

Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.例如以下: raw_input input raw_input函数 raw_input() 函数从标准输入读取一个行.并返回 ...

HoloLens开发手记 - Unity之Keyboard input 键盘输入

虽然HoloLens支持很多种输入方式,包括蓝牙键盘在内.但是大部分应用还是不能断定用户有物理键盘可以输入,所以虚拟键盘输入还是必须要提供的. Unity提供了一个TouchScreenKeyboar ...

python -input用户输入

#接收用户输入信息用input就可以了 #还有输入密码的,也就是隐藏的,pycharm中不好用,要到命令行去 import getpass name = input('name:') age = in ...

Python input保证输入为int类型

t = float(input("t(℃)="))

python 模拟键盘输入

备忘录 import win32api import win32con win32api.keybd_event(17,0,0,0) #ctrl键位码是17 win32api.keybd_event( ...

python 调用pymysql模块遇到\转义问题解决办法

1.问题情况 本来存入mysql的是字典,有汉字,由于python版本是2.7,所以在json的时候把我的值变成了unicode,那么在调用pymysql的时候,mysql给我转义取消了. 存之前: ...

python raw String 获取字符串变量中的反斜杠

常用的获取raw string的方式为: >>>r'\n' \n 不能用在字符串变量中,获取字符串变量中的反斜杠如下: tab = '\n' >>>tab.enco ...

python 如何让字符串的不具有转义的反斜杠具有转义功能

用 codecs, 大概是這樣子: # python3 code import codecs print(codecs.getdecoder("unicode_escape")(' ...

随机推荐

用Java集合中的Collections.sort方法对list排序的两种方法

用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

AC多模式匹配算法

建议:学习ac算法最好的途径是看论文pdf_Efficient_String_Matching_An_Aid_to_Biblio 一.一般的搜索算法 keyword: { he, she, his, ...

Zoj3332-Strange Country II(有向竞赛图)

You want to visit a strange country. There are n cities in the country. Cities are numbered from 1 t ...

java.util.concurrent.ExecutionException

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com ...

HDU 3788 和九度OJ 1006测试数据是不一样的

ZOJ问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

selenium webdriver学习-怎么等待页面元素加载完成

http://blog.csdn.net/aerchi/article/details/8055913 WebDriverWait类和ExpectedCondition

openwrt源码下载地址(镜像)

与openwrt.org的源码svn路径仅仅多了一个.cn svn://svn.openwrt.org.cn/openwrt/branches/backfiresvn://svn.openwrt.or ...

dotpeek的导出

在开始写之前先说明下,搜了很久的度娘,就是没找到dotpeek的导出功能,····,看来用的人不多, ------------------------------------------------- ...

Linux 系统设置sh文件开机自启动

工作中有一个linux下的服务需要启动,但是机器总是断电,导致需要反复启动,找了一下开机自启动的方法,解决了这个问题.Linux设置开机自启动非常简单,只要找到rc.local文件,将你需要自启动的文 ...

python使用关键字爬取url

python网路爬虫 --------- 使用百度输入的关键字搜索内容然后爬取搜索内容的url 开发环境:windows7+python3.6.3 开发语言:Python 开发工具:pycharm 第 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近在做中国银行的一个快捷支付渠道,使用的是 ISO8583 协议,一开始用的是JPOS框架,但是感觉框架比较臃肿,而且文档也比较少。在等待银行专线的过程中,自己闭门造车做了一个简8583报文解析框架 —— Simple8583,将程序重写了一遍,渠道中的代码量少了不少,这几天中行的接口在测试环境终于调试完成了。抽空分享一下这段时间自己学到的知识。 数据类型与编码格式: 根据接触到的数据类型将数据分为如下几种类型:          CHAR(asc编码,直接使用字符串的getBytes(ENCODING)方法获取字节数组)   BINARY(二进制编码,在打包时将8位01值组装为一个字节),             NUMERIC(BCD编码,即8421码),                LLVAR(变长域,采用ASC编码,每个LLVAR类型的域前会有1字节的域字节长度,表示长度的字节用BCD编码表示)                LLLVAR(变长域,与LLVAR域类似,不同之处在于每个LLLVAR域前会有2字节的域字节长度,长度同样以BCD编码表示)             LLVAR_NUMERIC(变长域,采用BCD编码,前有1字节的长度,长度为域值的长度,而非字节长,如域值为123456,编码后长度为3字节,但是表示域长的字节值为6)       如果用到其它数据类型可以在IsoType中进行添加,并在IsoField中添加处理操作 BitMap:        BitMap是ISO8583报文的精髓所在,ISO8583报文支持64域和128域两种,但是并非每次请求都会将所有域都请求过去,BItMap就起到了标识哪些域是有效的请求域,接收方也会根据BitMap中约定的值对域进行解析。   那么BitMap又是如何工作的呢?          首先,BItMap分为8字节和16字节两种情况,分别表示支持64域和128域,其第一位值为1,表示BitMap为16字节,否则为8字节。       其次,BitMap中的每一位对应数据域的第几域,有效域会置为1,比如01001000表示第二域和第5域为有效位。 在Simple8583中具体的实现是通过BitMap类实现的,具体可参考源码。 mti:            mti即 message type identifier消息类型标识,为4位bcd编码的数字标识符,用于描述信息的类型。 同一个mti可以用于标识多个不同的交易,比如一般常用的0200可以用来表示消费交易,消费撤销,分期付款消费和分期付款撤销,但是对于同一个mti标识的数据域类型定义是类似的。           具体的实现,我将Simple8583的xml文件设置为了两部分,一部分为公用的报文头,如msgLength,tpdu,bitmap等,另外一部分分按照mti的不同分为多个package体。 粗略的实现流程:          1)组装请求的Map数据(只组装需要的数据域,key值为对应的数据域或包头的值)          2)请求数据进入SimpleClient代理,SimpleClient根据传入的值解析xml文件(jaxb实现,做了缓存)          3)根据传入值的mti寻找对应的IsoPackage类,对找到的IsoPackage类进行clone(避免污染),对clone值中的域进行值处理和格式化         4)生成BitMap,计算Mac值(如有)          5)使用ByteArrayOutputStream将组装成的IsoPackage域值进行拼装成为一个大的byte数组,在byte前拼装两个字节的长度          6)通过Socket将数据发送并接受响应(读取前两个字节长度,根据长度获取其剩余报文),根据IsoPackage解析报文域,解析得到BitMap后根据BitMap对数据域进行解析,并将值都放入到对应的field中          7)将数据都放在Map中返回,并进行MAC校验(如有) 标签:Simple8583
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值