用 Python 重写 Java 代码同样的位移取反操作, 遇到问题, 请帮忙看看

2021-09-16 09:36:46 +08:00
 l4ever
inputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(srcFile), 1024 * 8));
            byte[] vb = new byte[7];

            if (inputStream.read(vb, 0, 6) > 0) {
                for (int i = 0; i < 6; i++) {
                    vb[i] = (byte) ((0xFF & vb[i]) >> 4 | (0xFF & vb[i]) << 4);
                    vb[i] = (byte) ~vb[i];
                }
                vb[6] = 0;
            }

            version = new String(vb, 0, vb.length - 1);
def decode():
    version_byte = b'\x9a\xac\x1d\xfc\xfc\xfc'
    result_bytes = bytearray()

    for i, value in enumerate(version_byte):
        version_int = value
        version_int = (version_int >> 4 | version_int << 4)
        version_int = ~version_int
        print(f'{version_int} {version_int}')
        result_bytes.insert(i, version_int)

帮忙看看 java 的代码, 我用 python 实现不了同样的功能

1450 次点击
所在节点    Python
3 条回复
2i2Re2PLMaDnghL
2021-09-16 12:31:03 +08:00
int 和 byte 的区别,Python 我记得应该是没有 byte 类型?至少 bytes.__getitem__ 出来的是 int
version << 4 会超过 byte 范围,做一下 (...)%256
~version 会变负的,方便点就是 255-version,正规点就是 (~version)%256
ruanimal
2021-09-16 21:40:32 +08:00
处理下溢出
wangxn
2021-09-16 22:16:13 +08:00
需要对位操作的结果作截断避免溢出:
```
def decode():
version_byte = b'\x9a\xac\x1d\xfc\xfc\xfc'
result_bytes = bytearray()

for i, value in enumerate(version_byte):
version_int = value
version_int = (version_int >> 4 | version_int << 4) & 0xff
version_int = (~version_int) & 0xff
print(f'{version_int} {version_int}')
result_bytes.insert(i, version_int)
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802185

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX