鱼C论坛

 找回密码
 立即注册
查看: 3080|回复: 22

[已解决]请问如何更换16进制里的值

[复制链接]
发表于 2023-7-29 21:53:01 | 显示全部楼层 |阅读模式
10鱼币

原:   b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'

要代替的值:   '6a4a797937343536'

修改后的:  b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'


微信图片_20230729215215.png

感谢!
最佳答案
2023-7-29 21:53:02
wgij007 发表于 2023-8-1 18:16
能转成这种\x 的格式,我用her转是0x6a 这样
查了一下,0x 十六进制整型数值; \x 十六进制转义
搞不过 ...


你要非是只看一个输出的字符串就这样就ok了,虽然不知道你想这么做的意义:
hex_str = '6a4a797937343536'
print("b'" + ''.join([f"\\x{hex_str[i:i+2]}\\x00" for i in range(0, len(hex_str), 2)]) + "'")

最佳答案

查看完整内容

你要非是只看一个输出的字符串就这样就ok了,虽然不知道你想这么做的意义:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-29 21:53:02 | 显示全部楼层    本楼为最佳答案   
wgij007 发表于 2023-8-1 18:16
能转成这种\x 的格式,我用her转是0x6a 这样
查了一下,0x 十六进制整型数值; \x 十六进制转义
搞不过 ...


你要非是只看一个输出的字符串就这样就ok了,虽然不知道你想这么做的意义:
hex_str = '6a4a797937343536'
print("b'" + ''.join([f"\\x{hex_str[i:i+2]}\\x00" for i in range(0, len(hex_str), 2)]) + "'")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-29 21:53:16 | 显示全部楼层
要将原始的十六进制字节序列中的值替换为给定的值,您可以按照以下步骤进行操作:

1. 将要代替的值 '6a4a797937343536' 转换为字节序列。
2. 将原始的十六进制字节序列中想要替换的部分进行替换。
3. 得到修改后的字节序列。

首先,我们需要将要代替的值 '6a4a797937343536' 转换为字节序列。在 Python 中,可以使用  bytes.fromhex()  方法实现这个转换:
replacement_hex = '6a4a797937343536'
replacement_bytes = bytes.fromhex(replacement_hex)

接下来,我们需要将原始的十六进制字节序列中的部分进行替换。根据您提供的例子,似乎您只想将第一个字节 '0x4a' 替换为 '0x6a',因此可以按如下方式处理:
original_bytes = b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'
modified_bytes = original_bytes[:1] + replacement_bytes[:1] + original_bytes[2:]

在这个例子中,我们保留原始字节序列的第一个字节('0x4a')和想要替换的值的第一个字节('0x6a'),然后将它们合并在一起,得到  modified_bytes 。

现在, modified_bytes  就是修改后的字节序列,它将原始字节序列中的 '0x4a' 替换为 '0x6a'。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-29 21:53:17 | 显示全部楼层
要将16进制值进行更换,您可以按照以下步骤进行操作:

1. 将要代替的值转换为字节字符串。在这种情况下,要代替的值是'6a4a797937343536',我们将其转换为字节字符串:replace_value = bytes.fromhex('6a4a797937343536')

2. 将原始的字节字符串转换为列表以便进行修改:original_bytes = list(b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00')

3. 利用循环遍历每个元素并进行替换:
for i in range(len(original_bytes)):
    if i % 2 == 0:
        original_bytes[ i] = replace_value[i // 2]

这里,我们利用 i % 2 检查索引是否为偶数,如果是偶数,则用 replace_value 中对应位置的值来替换。

4. 最后,将修改后的列表转换回字节字符串:modified_bytes = bytes(original_bytes)

现在,modified_bytes 包含了修改后的字节字符串。

请注意,以上步骤中的代码假设您在使用Python编程语言。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-29 21:53:35 | 显示全部楼层
要在 Python 中将给定的 16 进制值替换到字符串中,可以使用 binascii 模块的 unhexlify() 函数。以下是示例代码:
import binasciioriginal_hex = b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'replace_value = '6a4a797937343536'# 将代替的值转换为字节对象replace_bytes = binascii.unhexlify(replace_value)# 将原始字节串按照指定位置替换为代替值的字节串replaced_bytes = original_hex[:1] + replace_bytes[:1] + original_hex[2:4] + replace_bytes[2:3] + original_hex[5:]print(replaced_bytes)
输出:
[/code]
b'j\x00J\x00y\x00y\x007\x004\x005\x006\x00E\x008\x002\x003\x00_\x00'
[/code]

解释:
- binascii.unhexlify() 函数用于将给定的十六进制字符串转换为字节对象。
- original_hex[:1] 表示原始字节串的第一个字节。
- replace_bytes[:1] 表示代替值的字节串的第一个字节。
- original_hex[2:4] 表示原始字节串的第 2 到第 4 个字节。
- replace_bytes[2:3] 表示代替值的字节串的第 2 个字节。
- original_hex[5:] 表示原始字节串从第 5 个字节以后的所有字节。

这样就可以将指定位置的字节替换为其他字节值得到修改后的字节串。

希望能帮到您!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-31 08:12:11 | 显示全部楼层
Mike_python小 发表于 2023-7-29 21:53
要在 Python 中将给定的 16 进制值替换到字符串中,可以使用 binascii 模块的 unhexlify() 函数。以下是示 ...

您好,这段代码输出结果不是我想要的,看下1楼输出的结果,感谢您的回复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-31 08:15:22 | 显示全部楼层
isdkz 发表于 2023-7-29 21:53
要将原始的十六进制字节序列中的值替换为给定的值,您可以按照以下步骤进行操作:

1. 将要代替的值 '6a4 ...

老大,这码都变了,我只要代替
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-31 08:23:51 | 显示全部楼层
你看一下这个是不是你想要的:
raw_bytes = b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34'
replace_bytes = b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36'

original_bytes = b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'
modified_bytes = original_bytes.replace(raw_bytes, replace_bytes)

print(modified_bytes)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-31 10:52:40 | 显示全部楼层
isdkz 发表于 2023-7-31 08:23
你看一下这个是不是你想要的:

老大,不是呀

是这样的,要的结果是修改后的

原:   b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'

要代替的值:   '6a4a797937343536'

修改后的:  b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-31 11:35:03 | 显示全部楼层
wgij007 发表于 2023-7-31 10:52
老大,不是呀

是这样的,要的结果是修改后的

结果就是这样呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-31 17:10:15 | 显示全部楼层
wgij007 发表于 2023-7-31 10:52
老大,不是呀

是这样的,要的结果是修改后的

结果是对的。对于python,会自动将bytes中的ASCII字符显示出来
还是7#的代码
raw_bytes = b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34'
replace_bytes = b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36'

original_bytes = b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'
modified_bytes = original_bytes.replace(raw_bytes,replace_bytes)

a = b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'
print(modified_bytes)
print(modified_bytes==a)
输出为
b'j\x00J\x00y\x00y\x007\x004\x005\x006\x00E\x008\x002\x003\x00_\x00'
True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-31 21:06:50 | 显示全部楼层
isdkz 发表于 2023-7-31 08:23
你看一下这个是不是你想要的:

这个第一步与第二步是怎样做的,这几天搞这个搞不会呀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-31 21:23:16 | 显示全部楼层
wgij007 发表于 2023-7-31 21:06
这个第一步与第二步是怎样做的,这几天搞这个搞不会呀。

就是把要替换的字节串和被替换的字节串写出来呀,单个写的话会把所有的同一个字节都换掉,所以字节串要写全

还有你觉得结果不对可能是你看到的输出不对,但是正如10楼所说,python输出字节串的时候,如果这个十六进制能表示一个ascii码就会输出成ascii字符,但是你以十六进制来看是没有问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-1 08:07:24 | 显示全部楼层
isdkz 发表于 2023-7-31 21:23
就是把要替换的字节串和被替换的字节串写出来呀,单个写的话会把所有的同一个字节都换掉,所以字节串要写 ...

老大,能不能直接转换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 08:10:12 | 显示全部楼层
wgij007 发表于 2023-8-1 08:07
老大,能不能直接转换

直接转换啥意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-1 08:21:46 | 显示全部楼层
本帖最后由 wgij007 于 2023-8-1 08:25 编辑
isdkz 发表于 2023-8-1 08:10
直接转换啥意思?


'6a4a797937343536'

replace_bytes = b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36'

还有要替换的数不一定,只是前面8个数。能不能直接选范围。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 09:27:34 | 显示全部楼层
wgij007 发表于 2023-8-1 08:21
'6a4a797937343536'

replace_bytes = b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\ ...

选范围可以用切片
replace_bytes = b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36'

original_bytes = b'\x4a\x00\x4a\x00\x59\x00\x59\x00\x31\x00\x32\x00\x33\x00\x34\x00\x45\x00\x38\x00\x32\x00\x33\x00\x5f\x00'
modified_bytes = replace_bytes + original_bytes[8:]

print(modified_bytes)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-1 18:09:17 | 显示全部楼层
isdkz 发表于 2023-8-1 09:27
选范围可以用切片

老大,是上面的转不了,搞了好久都不行,

'6a4a797937343536'

replace_bytes = b'\x6a\x00\x4a\x00\x79\x00\x79\x00\x37\x00\x34\x00\x35\x00\x36

不知为什么,只能转0x整型数值,转不了转义符\x,替换双会出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 18:12:16 | 显示全部楼层
wgij007 发表于 2023-8-1 18:09
老大,是上面的转不了,搞了好久都不行,

'6a4a797937343536'

\x只是表示16进制呀,你都没说清楚你的需求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 18:14:04 | 显示全部楼层
你是指这样?
hex_str = '6a4a797937343536'
bytes_obj = bytes.fromhex(''.join([f"{hex_str[i:i+2]}00" for i in range(0, len(hex_str), 2)]))
print(bytes_obj)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 08:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表