这是我的Python代码
def string(data):
n=0
while True:
yield data[n]
n+=1
n%=len(data)
这是我调用string
方法的Java代码:
for(int i = 0; i < lengthText; i++) {
out[i] += string(t1) ^ string(t2);
}
string
方法:
public byte string(byte[] a){
int i = -1;
while(true){
i++;
i%= a.length;
return a[i];
}
}
如果我理解正确,它应该返回序列数据中的下一个项目,一旦序列结束 - 将您带到开头,依此类推到无穷大。
答案 0 :(得分:0)
Java中没有yield
的直接替代品。您可以尝试用一些小类来模拟它,例如
class YieldSubstitute<Data> {
private int n;
private Data[] data;
public YieldSubstitute(Data[] data) {
this.n = 0;
this.data = data;
}
public Data getNext() {
Data toReturn = data[n];
n = (n + 1) % data.length;
return toReturn;
}
}
然后使用它:
YieldSubstitute<Data> ys = new YieldSubstitute<Data>(data);
Data data1 = ys.getNext();
Data data2 = ys.getNext();
...
在这种情况下你需要记住yield
是特定于Python的元素并且首先在Java中使用它你需要找到一些共同点 - 你可以实现仔细分析你的函数实际在做什么。 / p>
另一方面 - 您对发电机的使用无效。您应首先使用参数初始化它,然后获取结果序列:
generator = string(data)
data1 = next(generator)
data2 = next(generator)
...
您的Java代码基本上是针对在第一次迭代时被破坏的无限循环。在尝试将return
视为yield
之前,您应该在python中了解yield
和return
之间的差异。
编辑:根据您的描述,您需要的是:
byte[] out = new byte[lengthText]; // initialized with 0s
int n = 0;
for (int i = 0; i < lengthText; i++) {
out[i] = data1[n] ^ data2[n]; // assuming that both arrays have more that 0 elements
n = (n + 1) % Math.min(data1.length, data2.length); // just in case their length differ
}
data1
和data2
都属于byte[]
类型。如果他们的长度保证相等,你可以跳过Math.min
。