2017-02-07 14 views
2

I次のコードを持っている:ビット単位のXOR演算とバイト配列

byte[] S = new byte[256]; 
byte[] T = new byte[256]; 

for (int i = 0; i < 256; ++i) { 
    S[i] = (byte)i; 
    T[i] = 13; 
} 

int j = 0; 
int i2 = 0; 
while (i2 < 256) { 
    j = j + S[i2] + T[i2] & 255; 
    byte[] arrby = S; 
    int n2 = i2; 
    arrby[n2] = (byte)(arrby[n2]^S[j]); 
    byte[] arrby2 = S; 
    int n3 = j; 
    arrby2[n3] = (byte)(arrby2[n3]^S[i2]); 
    byte[] arrby3 = S; 
    int n4 = i2++; 
    arrby3[n4] = (byte)(arrby3[n4]^S[j]); 
} 

初期値をS []配列:0,1,2,3,4,5 ...

arrby[n2] = (byte)(arrby[n2]^S[j]); 

S [0]「13」に「0」からその値を変更し、私はその理由を理解することはできません:プログラムがラインに到達

。 S [0]値を変更するものは何ですか?私は「^」だけではなく、Sの比較を行うと、arrby [N2]の値を変更して、それを見たよう[0]ここで

+4

'バイト[] = Sをarrby同じ割り当てられたメモリrefference arrbyになり、' - 'S'と' arrby'同一の配列を指します。 – Eran

+1

それを超えて:あなたの名前はちょっとひどいです。彼らは変数について何も言わない。また、あなたの配列の長さ(255)を "スペルアウト"するのはかなり恐ろしいことです。より良いtheArray.length、または少なくともSOME_CONSTANT = 255を代わりに使用してください。 – GhostCat

+0

'byte [] arrby = S' - これは' S'のコピーを作成せず、 'arrby'に保存します**。参照をコピーします。つまり、両方の変数が同じオブジェクトを参照します。 'arrby'を変更すると、' S'も変更されます。 – BackSlash

答えて

6

byte[] arrby = S; 

あなたがにarrbyポイントを作っていますその後S.

として同じ配列:

arrby[n2] = (byte)(arrby[n2]^S[j]); 

あなたはエントリーIを変更しますその配列n。

多田...だから

、解決策は以下のとおりです。あなたは、配列の内容を変更したくない場合、あなたはその配列を指し参照を作成していないことを確認してください。あなたの要求に応じて、例えばのデータをSから新しく作成したarrbyの配列にコピーすることができます。

0

以下のコードの行は、S

byte[] arrby = S; 
関連する問題