16进制字符串 转为 字节

16进制字符串 转为 字节

import binascii
# 16进制字符串 转为 字节
v1 = "4E2918885FD98109869D14E0231A0BF4"
"""
bs = bytearray() # []
for i in range(0, len(v1), 2):
item_hex = v1[i:i + 2]
item_int = int(item_hex, base=16)
bs.append(item_int)
v3 = bytes(bs)
print(v3) # b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4'
"""
v3 = binascii.a2b_hex(v1)
print(v3) # b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4'
l = [int(i) for i in v3]
print(l) # [78, 41, 24, 136, 95, 217, 129, 9, 134, 157, 20, 224, 35, 26, 11, 244]
#################################################################################
l = [78, 41, 24, 136, 95, 217, 129, 9, 134, 157, 20, 224, 35, 26, 11, 244]
# 数组转换
print(bytearray(l)) # bytearray(b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4')
print(bytes(l)) # b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4'
l1 = [hex(i) for i in l]
print(l1) # ['0x4e', '0x29', '0x18', '0x88', '0x5f', '0xd9', '0x81', '0x9', '0x86', '0x9d', '0x14', '0xe0', '0x23', '0x1a', '0xb', '0xf4']
print(binascii.b2a_hex(bytearray(l))) # b'4e2918885fd98109869d14e0231a0bf4'

逆向时有一些字符串是通过字节数组来表示(UTF-8编码)

提醒:逆向时有一些字符串是通过字节数组来表示(UTF-8编码)

v1 = "武沛齐"
v2 = [230, 173, 166, 230, 178, 155, 233, 189, 144]
import java.util.Arrays;
public class Hello {
public static void main(String[] args) {
// 1.字节数组(转换为字符串) [字节,字节,字节]
byte[] dataList = {97, 105, 100, 61, 50, 52, 54, 51, 56, 55, 53, 55, 49, 38, 97, 117, 116, 111, 95, 112, 108, 97, 121, 61, 48, 38, 99, 105, 100, 61, 50, 56, 57, 48, 48, 56, 52, 52, 49, 38, 100, 105, 100, 61, 75, 82, 69, 104, 69, 83, 77, 85, 74, 104, 56, 116, 70, 67, 69, 86, 97, 82, 86, 112, 69, 50, 116, 97, 80, 81, 107, 55, 87, 67, 104, 67, 74, 103, 38, 101, 112, 105, 100, 61, 48, 38, 102, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 48, 57, 51, 55, 38, 108, 118, 61, 48, 38, 109, 105, 100, 61, 48, 38, 112, 97, 114, 116, 61, 49, 38, 115, 105, 100, 61, 48, 38, 115, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 52, 51, 55, 50, 38, 115, 117, 98, 95, 116, 121, 112, 101, 61, 48, 38, 116, 121, 112, 101, 61, 51};
String dataString = new String(dataList);
System.out.println("字符串是:" + dataString);
// 2.字符串->字节数组
try {
// Python中的 name.encode("gbk")
String name = "武沛齐";
byte[] v1 = name.getBytes("GBK");
System.out.println(Arrays.toString(v1)); // [-50, -28, -59, -26, -58, -21]
// Python中的 name.encode("utf-8")
byte[] v2 = name.getBytes("UTF-8");
System.out.println(Arrays.toString(v2)); // [-26, -83, -90, -26, -78, -101, -23, -67, -112]
} catch (Exception e) {
}
}
}

image-20230322163051876

需求来了:某个app逆向,在Java代码中得到一个字节数组 [-50,-28,-59,-26,-58,-21],请通过Python代码将这个字节数组转换成字符串?

  • 在Java中的字节范围:-128127;Python中字节的范围:0255。

    Java 0 1 2 3 4 .. 127 -128 -127 -126 -3 -2 -1
    Python 0 1 2 3 4 .. 127 128 129 130 ...253 254 255
    java, 有符号:-128~127
    python,无符号:0~255
    byte_list = [-50,-28,-59,-26,-58,-21]
  • 让数字转化弄成字节并拼接起来 bytearray

# Python脚本,方便你们以后使用。
byte_list = [-50, -28, -59, -26, -58, -21]
bs = bytearray() # python字节数组
for item in byte_list:
if item < 0:
item = item + 256
bs.append(item)
str_data = bs.decode('gbk') # data = bytes(bs)
print(str_data)
data_list = [-26, -83, -90, -26, -78, -101, -23, -67, -112]
num_list = bytearray()
for i in data_list:
if i < 0:
i = i + 256
num_list.append(i)
text = num_list.decode('utf-8')
print(text)
posted @   hanfe1  阅读(581)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2019-03-08 python之路day12--装饰器的进阶
点击右上角即可分享
微信分享提示