遇到一个通信协议,需要将16 进制的高 4 位和低 4 位用ASCII 码表示。
如地址为 0x01 时,16 进制的高 4 位和低 4 位 ASCII 码表示为‘0’和‘1’,对应 16 进制表示为 0x30 和 0x31;
ASCII与16进制对应关系参考:ASCII与16进制对应关系
接下来将用python 实现
1.16进制高4位低4位转ASCII码
'''
输入:HexValue 十六进制数
输出:对应的高位hex(AsciiTop)和低位hex(AsciiBtm)的ASCII码
'''
def HexToAscii_SendTopBtm(HexValue):
HexTop = int(HexValue / 16)
HexBtm = int(HexValue % 16)
if HexTop >= 0 and HexTop <= 9:
AsciiTop = HexTop + 0x30
elif (HexTop>=10) and (HexTop<=15):
AsciiTop = HexTop + 0x37
else:
AsciiTop = 0xff
if HexBtm >= 0 and HexBtm <= 9:
AsciiBtm = HexBtm + 0x30
elif (HexTop>=10) and (HexBtm<=15):
AsciiBtm = HexBtm + 0x37
else:
AsciiBtm = 0xff
print("AsciiTop:", hex(AsciiTop))
print("AsciiBtm:", hex(AsciiBtm))
测试代码:
如:
HexToAscii_SendTopBtm(0x01)
输出:
AsciiTop: 0x30
AsciiBtm: 0x31
如:
HexToAscii_SendTopBtm(0xB1)
输出:
AsciiTop: 0x42
AsciiBtm: 0x31
2.一个10进制数转16进制再高4位低4位转ASCII码
'''
输入:十进制数
输出:对应的高位hex(AsciiTop)和低位hex(AsciiBtm)的ASCII码
'''
def byte_encoding(x):
list_x = [x] #这里可以改为多个数所以用list
result = []
for data in list_x:
if data < 0:
data = -data # 取反 int 19
data = data | 0x8000 # 将其最高位转换为1
data = bin(data) # 10进制转换为二进制
data_bin = data[2:] # 去掉‘0b'前缀
vv = []
for i in data_bin:
if i == '1': # 对每一位取反,即1变为0
v = 0
vv.append(v)
else: # 0变1
v = 1
vv.append(v)
s = ''
for i in vv:
s = s + str(i)
aa = int(s, 2) # 将字符串二进制数变成整型
aa = aa + 1
aa = aa | 0x8000 # 将其最高位转换为1
aa_value = bin(aa) # 10进制转换为二进制
data_aft = aa_value[2:] # 去掉‘0b'前缀
else:
data = bin(data) # 10进制转换为二进制 str 0b10011
data = data[2:] # 去掉‘0b'前缀
data_aft = ""
if len(data) < 8: # 补齐0位
while len(data) < 8:
data = str(0) + data
data_aft += data # 补齐0以后的字符串 str 0000000000010011
# int() 函数 ,第一个参数是字符串,第二个参数是说明,这个字符串是几进制的数
data_H = int(data_aft[0:4], 2) # int 128 ~ 1000 0000
result.append(data_H)
data_L = int(data_aft[4:9], 2) # int 19 ~ 0001 0011
result.append(data_L)
return result
def HexToAscii_SendTopBtm(HexValue):
HexTop = HexValue[0]
HexBtm = HexValue[1]
if HexTop >= 0 and HexTop <= 9:
AsciiTop = HexTop + 0x30
elif (HexTop>=10) and (HexTop<=15):
AsciiTop = HexTop + 0x37
else:
AsciiTop = 0xff
if HexBtm >= 0 and HexBtm <= 9:
AsciiBtm = HexBtm + 0x30
elif (HexTop>=10) and (HexBtm<=15):
AsciiBtm = HexBtm + 0x37
else:
AsciiBtm = 0xff
print("AsciiTop:", hex(AsciiTop))
print("AsciiBtm:", hex(AsciiBtm))
测试代码:
如:
hex_topbtm = byte_encoding(1)
HexToAscii_SendTopBtm(hex_topbtm)
输出:
AsciiTop: 0x30
AsciiBtm: 0x31
如:
hex_topbtm = byte_encoding(177) # 0xB1对应177
HexToAscii_SendTopBtm(hex_topbtm)
输出:
AsciiTop: 0x42
AsciiBtm: 0x31