0

私はバイト配列を持っていますmyByteArray[82]

この配列の正確に 37 ビットを補数値に変更したいと考えています。すなわち。bit0 に「1」がある場合は、「0」に変更します。このバイト配列にエラーを導入するには、最初の 37 ビットを変更する必要があります。

これを行う方法を提案してください

4

4 に答える 4

2

試す

    byte[] a82 = ...
    Set<Integer> set = new HashSet<Integer>();
    while (set.size() < 37) {
        set.add((int) (Math.random() * 82));
    }
    for (int i : set) {
        int ibyte = i / 8;
        int ibit = i % 8;
        int m = 1 << ibit;
        a[ibyte] ^= m;
    }
于 2013-04-04T05:08:43.267 に答える
2

あなたがやろうとしていることは完全には明らかではありません。私が最もよく理解しているのは、82 バイトの配列があり、配列の最下位 37 ビットを反転したいということです。1バイトは8ビットなので、これを行うことができます:

byte[] myByteArray = new byte[82];
// invert lowest 32 bits, 8 at a time
for (int i = 0; i < 4; ++i) {
    myByteArray[i] = (byte)(~myByteArray[i]);
}
// invert next five bits
myByteArray[4] = (byte) (
    (myByteArray[4] & 0xE0) // top 3 bits unchanged
    |
    ((~myByteArray[4)) & 0x1F) // bottom 5 bits inverted
    );
于 2013-04-04T04:21:14.077 に答える
1

これは機能します:

int nBits = 37;

int i = 0;

for (; i<nBits / 8; ++i)
    myByteArray[i] = (byte)((byte) myByteArray[i] ^ 0xFF);

myByteArray[i] = (byte)(myByteArray[i] ^ ((0xFF >>> 5) ^ 0xFF));

最後の行で 0xFF を使用して最終的な XOR を実行するかどうかは、最上位ビットを最初のビット (使用する) と見なすか、最後のビット (省略する) と見なすかによって異なります。

于 2013-04-04T04:25:06.463 に答える
0

ランダムに選択された特定の 37 ビットを反転するには:

// array of 82 bytes with 37 selected bits set to 1, all the rest zero
// you could generate this programmatically as well if you need a different
// set of bits each time, but your question implies you don't
byte[] mask = { 0x00, 0x01, 0x02, 0x80, .... 0x00 };

for (int i=0; i<myByteArray.length; i++)
{
    myByteArray[i] ^= mask[i];
}

ビット排他的 OR 演算子を使用します^。xor の真理値表は

    M a s k
    | 0 | 1
D  -+---+---
a  0| 0 | 1
t  -+---+---
a  1| 1 | 0

マスクに 1 がある場合は常に、データ内の対応するビットが反転されます。

于 2013-04-04T05:04:28.087 に答える