【问题标题】:How do I reverse the byte order of a list of constants in Python?如何反转 Python 中常量列表的字节顺序?
【发布时间】:2018-11-28 03:37:30
【问题描述】:

我一直在寻找一种方法来从 C 源文件中提取常量并在一个自动化过程中反转它们的字节顺序(无需手动输入)。到目前为止,我已经设法利用 pycparser 为我完成了大部分繁重的工作,并创建了一个脚本,将 C 文件的所有常量打印到控制台。它打印的格式是这样的: 常量:int,0x243F6A88

我的问题是,有人知道在 Python 中自动执行此转换过程的直观方法吗?我知道如何使用 join() 来反转字节顺序,但我正在努力想办法做到这一点,这样我就可以最大限度地减少手动输入的数量。理想情况下,我的脚本会打印出常量(已经完成),然后使用某种正则表达式(也许?)来转换任何以 0x 开头的常量(有很多我不想打印的随机数)。我希望这是有道理的,谢谢!

到目前为止我所拥有的:

class ConstantVisitor(c_ast.NodeVisitor):
def __init__(self):
    self.values = []
def visit_Constant(self, node):
    self.values.append(node.value)
    node.show(showcoord=True)

def show_tree(filename):
# Note that cpp is used. Provide a path to your own cpp or
# make sure one exists in PATH.
    ast = parse_file(filename, use_cpp=True,cpp_args=['-E', r'-Iutils/fake_libc_include'])
    cv = ConstantVisitor()
    cv.visit(ast)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        filename  = sys.argv[1]
    else:
        filename = 'xmrig-master/src/crypto/c_blake256.c'

    show_tree(filename)

【问题讨论】:

  • 您可以在问题中添加示例代码吗?
  • 使用适当的 C 解析器而不是依赖正则表达式感觉更稳定。看看github.com/eliben/pycparser 或类似的东西。
  • 嘿 Selcuk,我正在使用 pycparser 打印出常量。但是,我正在寻找一种方法来反转这些常量的字节顺序,但我不知道 pycparser 是否具有该功能。谢谢!
  • 如果您只想处理0xDEADBEEF 样式的整数常量,并且它们在源代码中始终是全长的(正好是八个十六进制数字),那么使用正则表达式将整个 C 文件作为文本处理是很简单:new_file.write(re.sub(r'\b0x([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})\b', r'0x\4\3\2\1', old_file.read())。使用 C 解析器库将更加健壮,但也更加复杂。为了让它工作,你需要让你的Visitor打印出它遇到的everything。十六进制常量会在打印前被字节交换,其他一切都保持不变。
  • 嗨,Blckknght,感谢您的回复。我知道如何让访问者打印出它遇到的所有内容,但你知道我如何在打印之前对常量进行字节交换吗?谢谢

标签: python pycparser


【解决方案1】:

您的任务似乎有 3 个步骤:

  1. pycparser 解析代码 - 你有这个
  2. 查找所有常量(只是整数常量?浮点数怎么样?)并反转它们的字节顺序
  3. 对结果做点什么

对于 (2),您可以使用建议 in this answer 之类的内容,但请将其调整为您需要的实际类型。

对于 (3),不清楚您要做什么;您是否尝试将常量写回原始 C 文件?那么,pycparser 并不是最好的工具。您可能希望使用 Python 绑定到 Clang,因为 Clang 工具旨在修改现有代码。

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多