【问题标题】:Flipping the last bit in a byte翻转一个字节的最后一位
【发布时间】:2023-04-08 22:30:01
【问题描述】:

最终目标是翻转位置 X 的最后一位字节。假设我们从网站中的一个字符串开始,我们对其进行 base64 解码,以便我们可以使用它:

IV = "2RDs+xm/AxtYj+XViJmBPQ=="
IV = base64.b64decode(IV)

这给了我们一些看起来像 (����X��Ո��=) 的东西,看起来像垃圾,但我们可以使用它。处理此问题的最佳方法是将其放入列表中。

woop = list(IV)

假设在此示例中,我们希望在第 2 个字节处翻转最后一位。 Python 从零开始计数,因此我们需要将计数器减 1。否则,我们会将程序指向第 3 个字节!翻转任何你 XOR 1 的东西。现在这是我的问题......

CounterX = CounterX - 1
woop[CounterX] = chr(ord(IV[CounterX]) ^ 1)
woop = "".join(woop)
IV = woop

我很确定这会翻转整个字节。如何告诉它只翻转 IV[CounterX] 字节的最后一位?

【问题讨论】:

  • 你认为为什么会翻转整个字节?
  • 不,^ 1 只会翻转一个字节的最低有效位。如果之前的值是 255,那么现在是 254。
  • @MartijnPieters 哈哈,我的答案很好......并在评论中:P print bin(0xff ^ 0x01)
  • 我目前的理解是,一旦你使用 base64 解码,你看到的是字节,而不是位。
  • @OneManRiot: OP 在第三个字节中翻转一位。

标签: python byte bit xor


【解决方案1】:
  • base64.decode 返回一个字符串
  • python2x 中的字符串总是字节!
    • 如果您使用 python3,您可能需要调用 bytes(IV) 以确保 8 位块...但我不确定我不使用 python3 很多
  • some_int XOR 1 只会翻转最低字节
    • print bin(0xff ^ 0x01) 所示

所以我们再次回到是什么让您认为这不是您所看到的行为?你能给我们举个例子来说明这个问题吗?

【讨论】:

  • 这是 Python 2;我以前帮助过OP。
  • 你知道它在 py3 中是否同样有效吗?我怀疑它会(直觉?)......但是如果没有关于python 3的警告就离开那个声明会感到不舒服:P
  • 在 Python 3 中,您将在此处使用字节数组,为您提供整数并消除对 ord()chr() 调用的需要。 IV[2] ^= 1 容易多了。
  • 是的,这是 Python 2。所以你是说我的代码正确地翻转了我定位的字节中的最后一位?
  • 我确实是说这段代码woop[CounterX] = chr(ord(IV[CounterX]) ^ 1) 绝对翻转了 counterX 指向的任何字节的最后一位。再次print bin(ord(IV[CounterX])),">>",bin(ord(IV[CounterX])^1) 将轻松地为您证明这一事实
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
相关资源
最近更新 更多