Используя Java для шифрования целых чисел

Наконец-то получил ответ, предоставленный , для изменения переменной сценария из Closure в Groovy ; был настолько сосредоточен на Дженкинсе, как виновнике, что я никогда не пытался попробовать сценарий в Groovy.

Замена changeAVar на

getMetaClass().setProperty(this, "aVar", newAVar) 

работает отлично.

Демонстрация:

node() {
    a = load ("path/to/file")
    println("Printing ${a.aVar.toString()}") //This prints "[]"
    a.changeAVar("b")
    println("Printing ${a.aVar.toString()}") //This prints "[b]"
    a.changeAVar2("c")
    println("Printing ${a.aVar.toString()}") //This prints "c"
    println("Printing ${aVar}") //This fails
}

В пути / к / файлу:

import groovy.transform.Field

@Field def aVar = []

def changeAVar(newAVar){
    aVar.add(newAVar)
}

def changeAVar2(newAVar){
    getMetaClass().setProperty(this, "aVar", newAVar)
}

return this    

6
задан Dan McClain 10 June 2009 в 13:43
поделиться

5 ответов

Можно превратить ints в байт [] использование DataOutputStream, как это:

ByteArrayOutputStream baos = new ByteArrayOutputStream ();
DataOutputStream dos = new DataOutputStream (baos);
dos.writeInt (i);
byte[] data = baos.toByteArray();
// do encryption

Затем дешифровать его позже:

byte[] decrypted = decrypt (data);
ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();
12
ответ дан 8 December 2019 в 03:28
поделиться

Просто используйте NIO. Это разработано для этой определенной цели. ByteBuffer и IntBuffer сделают то, в чем Вы нуждаетесь быстро, эффективно, и изящно. Это обработает большое/с прямым порядком байтов преобразование, "прямые" буферы для высокопроизводительного IO, и можно даже смешать типы данных в буфер байта.

Преобразуйте целые числа в байты:

ByteBuffer bbuffer = ByteBuffer.allocate(4*theIntArray.length);
IntBuffer ibuffer = bbuffer.asIntBuffer(); //wrapper--doesn't allocate more memory
ibuffer.put(theIntArray);                  //add your int's here; can use 
                                           //array if you want
byte[] rawBytes = bbuffer.array();         //returns array backed by bbuffer--
                                           //i.e. *doesn't* allocate more memory

Преобразуйте байты в целые числа:

ByteBuffer bbuffer = ByteBuffer.wrap(rawBytes);
IntBuffer ibuffer = bbuffer.asIntBuffer();
while(ibuffer.hasRemaining())
   System.out.println(ibuffer.get());      //also has bulk operators
5
ответ дан 8 December 2019 в 03:28
поделиться

Можно также использовать BigInteger для преобразования:

 BigInteger.valueOf(integer).toByteArray();
9
ответ дан 8 December 2019 в 03:28
поделиться

создайте 4 массива байтов и скопируйте интервал в массив на 4 шагах с поразрядным ANDs, и bitshifting, как Paulo сказал.

Но помните, что алгоритмы блока, такие как AES и DES работают с 8-или 16-байтовыми блоками, таким образом, необходимо будет заполнить массив к тому, в чем нужен алгоритм. Возможно, оставьте первые 4 байта 8 массивов байтов как 0, и другие 4 байта содержат целое число.

0
ответ дан 8 December 2019 в 03:28
поделиться

Я нашел следующий код, который может помочь Вам, так как Целое число в Java всегда 4 байта длиной.

public static byte[] intToFourBytes(int i, boolean bigEndian) {  
    if (bigEndian) {  
        byte[] data = new byte[4];  
        data[3] = (byte) (i & 0xFF);  
        data[2] = (byte) ((i >> 8) & 0xFF);  
        data[1] = (byte) ((i >> 16) & 0xFF);  
        data[0] = (byte) ((i >> 24) & 0xFF);  
        return data;  

    } else {  
        byte[] data = new byte[4];  
        data[0] = (byte) (i & 0xFF);  
        data[1] = (byte) ((i >> 8) & 0xFF);  
        data[2] = (byte) ((i >> 16) & 0xFF);  
        data[3] = (byte) ((i >> 24) & 0xFF);  
        return data;  
    }  
}  

Можно найти больше информации о параметре с обратным порядком байтов здесь: http://en.wikipedia.org/wiki/Endianness

3
ответ дан 8 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: