16进制转为字符串_Python 十六进制hexbytesstr之间的转换和Bcc码的生成

前言

做测试模拟器用到了hex-bytes-str之间的转换bcc码的校验,这里总结了一些方法分享给大家。

实例

直接上代码

1.转为十六进制(Hex)字符串

 def getStringFromNumber(self,size,value):
"""
转为十六进制(Hex)字符串
:param size:
:param value:
:return:
"""
size=int(size)
value=int(value)
by = bytearray([])
for i in range(1,size+1):
val = value >> 8 * (size - i) & 255
by.append(val)
val = by.hex()
print("===============================")
print("%s转为%s个字节十六进制(Hex)字符串:%s"%(value,size,val))
print("===============================")
return val
getStringFromNumber(5,11)

执行代码:

446077b925bde642490d70e2f6ff14e7.png

方法:getStringFromNumber(size,value)参数一为生成几个batys,参数二为被转化数字

2.bcc校验码

    def bcc(self,value):
"""
bcc 检查码
:param number:
:return:
"""
numb = len(number)
nb = int(numb / 2)
bcc = 0
for i in range(nb):
a = 2 * i
b = 2 * (i + 1)
aa = number[a:b]
bcc = bcc ^ int(aa, 16)
print("===============================")
print("生成bcc码:%s" % f'{bcc:x}')
print("===============================")
return f'{bcc:x}'
bcc('11111111111111111111111111111111111111111111111111111111111222222222222222222222')

执行代码:

4d1355588bfb24eb12ee6f5068a97517.png

方法:bcc(value)参数被转化数字

3.时间字节数组(byte[])转为十六进制(Hex)字符串和解码时间

   def datetime(self):
"""
字节数组(byte[])转为十六进制(Hex)字符串
:return:
"""
print("===============================")
current_time = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
datatime = current_time[2:]
by = bytearray([])
aa = datatime.split("-")
for val in aa:
by.append(int(val))
val = by.hex()
print("当前%s转化十六进制:%s" % (current_time, val))
return val

def time_hex_dec(self,number):
"""
时间解码
:param number:
:return:
"""
numb = len(number)
nb = int(numb / 2)
datatime=[]
for i in range(nb):
a = 2 * i
b = 2 * (i + 1)
num = number[a:b]
datatime.append(num)
Gettime ="20"
for key,val in enumerate(datatime):
b = eval("0x" + val)
Gettime += str(b)
if key <5:
Gettime = Gettime +"-"
print('时间解码:%s' % Gettime)
print("===============================")
return Gettime

time = datetime()
time_hex_dec(time)

执行代码:

5401d7e16c8415c1694286f699088ca5.png

方法:time (value)参数被转化数字 time_hex_dec(time)解码时间

4.字符串转16进制 与 16进制转字符串

 def str_to_hex(self,data):
"""
# 字符串转16进制
:param data:
:return:
"""
print("===============================")
str_16 = binascii.b2a_hex(data.encode('utf-8'))
print("字符串%s转16进制:%s"%(data,str_16))
return str_16

def hex_to_str(self,data):
"""
# 16进制转字符串
:param data:
:return:
"""
strs = (binascii.unhexlify(data)).decode()
print("16进制%s转字符串:%s"%(data,strs))
print("===============================")
return strs
data = str_to_hex("wencheng你好")
hex_to_str(data)

执行代码:

82c502860cc1baa9cbc03dec55b6f535.png

方法:str_to_hex(value) ,hex_to_str(data)

5.字符串转字节 str --> bytes与字节转字符串 bytes --> str

 def str_to_bytes(self,b):
"""
字符串转字节 str --> bytes
:param b:
:return:
"""
print("===============================")
print(str.encode(b)) # 默认 encoding="utf-8"
print(bytes(b, encoding="utf8"))
print(b.encode()) # 默认 encoding="utf-8"
return str.encode(b)

def bytes_to_str(self,a):
"""
字节转字符串 bytes --> str
:param b:
:return:
"""
print(bytes.decode(a)) # 默认encoding="utf-8"
print(str(a, encoding="utf-8"))
print(a.decode()) # 默认 encoding="utf-8"
print("===============================")
data = str_to_bytes("wencheng你好")
bytes_to_str(data)

执行代码:

765e2d30eb6a35cec8483a1a5bce97d5.png

方法:str_to_bytes(value) ,bytes_to_str(data)

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家的支持。

更多文章关注小编公众号:自动化测试 To share

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 十六进制转换为二数的汇编语言是一种使用汇编指令将十六进制转换为二数的程序设计语言。具体来说,首先需要使用汇编指令将十六进制转换为八数,然后再使用汇编指令将八转换为二数。以下是将十六进制转换为二数的流程图:流程图:| | |------------| | 十六进制 | |------------| | 转换 | |------------| | 八 | |------------| | 转换 | |------------| | 二 | ### 回答2: 汇编语言代码如下: ``` ;输入:存储在内存地址0x1000处的十六进制数 ;输出:存储在内存地址0x2000处的二数 ORG 0x1000 ;设置程序起始地址为0x1000 START: MOV R0, #0x2000 ;将R0寄存器设置为存储二数的内存地址0x2000 MOV R1, #0x1000 ;将R1寄存器设置为存储十六进制数的内存地址0x1000 LOOP: LDRB R2, [R1], #1 ;从R1所指向的内存地址读取一个字节,存入R2寄存器,并递增R1寄存器的值 CMP R2, #0x0 ;判断R2寄存器的值是否为0 BEQ END ;如果是,跳转到END标签处 MOV R3, #8 ;将R3寄存器的值设置为8,即二数的位数 MOV R4, #0 ;将R4寄存器的值设置为0,作为二数的初始值 DECODE: ROR R2, #1 ;循环右移R2寄存器的值一位 BCC SKIP ;如果最低位为0,跳转到SKIP标签处 ORR R4, #1 ;如果最低位为1,将R4寄存器的值设置为1 SKIP: SUBS R3, #1 ;将R3寄存器的值减1 BNE DECODE ;如果R3寄存器的值不为0,跳转到DECODE标签处 STRB R4, [R0], #1 ;将R4寄存器的值存入R0所指向的内存地址,并递增R0寄存器的值 B LOOP ;跳转到LOOP标签处 END: END ;结束程序 ``` 流程图如下: ``` +------------------------------------------------------+ | START标签 | +---------+--------------------------------------------+ | | v +--------------------LOOP标签--------------------------+ | 从内存地址0x1000读取一个字节存入R2寄存器, 并递增R1 | | 寄存器的值 | | | | +--------------------------------------+ | | | R2寄存器的值等于0 ? | | | +--------------+-----------------------+ | | | | | |是 | | | | | +--------------v-----------------------+ | | | END标签 | | | +------+--------------------------+--+ | | | | | | |否 |否 | | | | | | v v | | 将R3寄存器的值设为8,将R4寄存器的值设为0 | | +----------------------+ +----------------------+| | | DECODE标签 || | +--^--------------+ +-------------+----------^-+ | | | | | | | | | | 最低位为1 | | | | | | | | | | +----+--------+ | | | | | | | | |否 |是 | | | | | | | | +------v-------------------+ | | 将R2寄存器的值右移一位 | | +----------+ | | | | | | v | | | 最低位为0 ? | | | +---------+ | | | | | | | | 是 | | | | | v | | 将R4寄存器的值设为1 | | | | +-------------+ | | | | | | v v | | 将R3寄存器的值减1 | | | | +-------------+ | | | | | | v v | | 如果R3寄存器的值不为0, 跳转到DECODE标签处| | | +---------------------+ ``` 注意:该汇编代码是伪代码,具体实现可能因不同的汇编语言和处理器有所不同。流程图仅为简化表示,具体的汇编语言流程可能更加复杂。 ### 回答3: 以下是将十六进制转换为二数的汇编语言程序的示例,并附有相应的流程图。 汇编代码: ```assembly DATA SEGMENT HEX DB 1AH ; 待转换十六进制数 BINARY DB 8 DUP(0) ; 存储二结果,共8位 DATA ENDS CODE SEGMENT ASSUME DS:DATA, CS:CODE START: MOV AX, DATA ; 将数据段地址加载到AX寄存器 MOV DS, AX ; 将数据段地址存入DS寄存器 MOV CL, 4 ; CL寄存器存储移位计数器的初始值 MOV SI, 8 ; SI寄存器作为存储二结果的索引 CONVERT: MOV AL, HEX ; 将待转换十六进制数加载到AL寄存器 AND AL, 0FH ; 保留最低4位 CMP AL, 9 ; 若十六进制数小于等于9 JBE NUMERIC ; 转到NUMERIC标签处理数字 ADD AL, 7 ; 若十六进制数大于9,则对应添加'A'-'9' JMP TOBINARY ; 转到TOBINARY标签 NUMERIC: ADD AL, 30H ; 将数字映射到对应的ASCII码 TOBINARY: MOV BL, 8 ; BL寄存器存储二位计数器的初始值 SHIFT: MOV AH, AL ; 将待处理的十六进制数复到AH寄存器 SHR AH, CL ; 右移CL次,将需要的二位移到低4位 AND AH, 01H ; 保留最低位 MOV [BINARY+SI-1], AH ; 将最低位存储到BINARY数组中 DEC SI ; 递减索引 DEC BL ; 递减位计数器 CMP BL, 0 ; 检查位计数器是否为0 JNZ SHIFT ; 若不为0,则继续移位操作 JMP EXIT ; 若为0,则退出程序 EXIT: MOV AH, 4CH ; 退出程序 INT 21H CODE ENDS END START ``` 流程图见下图: ``` +-----------+ | | | START | | | +-----+-----+ | | V +-----+-----+ | | | HEX -> AL | | REGIST- | | ERS | +-----+-----+ | | / \ / \ YES / \ V V +------+-----+-----+ | | | HEX -> NUMERIC | | LABEL | +----+-----+-----+ | | | / \ | / \ YES | / \ V V V +---+ +---+ | | | HEX -> | | TOBINARY| | LABEL | +----+-----+ | | / \ / \ YES / \ V V +------+ +---+ +---+ | | | | | SHIFT| | | | | | | +---+---+ | | | | | | / \ | | / \ | | / \ | V V V | +---+---+ | | | | EXIT | | LABEL | +-----+--------+ | | V +-----+-----+ | | | FINISH | | | +-----------+ ``` 请注意,上述示例代码和流程图仅用于简单说明十六进制转换为二数的原理和流程,并不包含完整的异常处理和错误检查。实际使用时,还需要考虑数据范围和其他错误情况的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值