2015-05-28 14 views
6

Qui sto lavorando con un Java in C# campione traduzione app che coinvolge la crittografia (AES e RSA e così via ...)Perché la necessità di un bit "e" per alcune conversioni char in byte in Java?

Ad un certo punto nel codice Java (quello che funziona davvero e di essere tradotto in C#), ho trovato questo pezzo di codice:

for (i = i; i < size; i++) { 
    encodedArr[j] = (byte) (data[i] & 0x00FF); 
    j++; 
} // where data variable is a char[] and encodedArr is a byte[] 

Dopo un po 'googling (here), ho visto che questo è un comportamento comune soprattutto sul codice Java ...

so che char è un tipo a 16 bit e byte è solo a 8 bit, ma non potrei inserirlo e il motivo per questo bit a bit e operazione per una conversione char->byte.

Qualcuno potrebbe spiegare?

Grazie in anticipo.

+0

Probabilmente per aggirare un possibile overflow se c'è qualche valore nel byte superiore del char. Altrimenti basta lanciarlo risulterebbe in un overflow per un byte poiché può contenere solo 255 (FF) come valore massimo. –

risposta

4

Quando si converte 0x00FF a binario diventa 0000 0000 1111 1111

Quando si e qualsiasi cosa con 1, è essa stessa:

1 && 1 = 1, 0 && 1 = 0

Quando si e qualsiasi cosa con 0, è 0

1 && 0 = 0, 0 && 0 = 0

Quando questa operazione si verifica encodedArr[j] = (byte) (data[i] & 0x00FF); sta prendendo gli ultimi 8 bit e gli ultimi 8 bit solo dei dati e li memorizza. Sta buttando via i primi 8 bit e memorizzando gli ultimi 8

Il motivo per cui questo è necessario è perché un byte è definito come un valore di otto bit. Il bit a bit e esiste per arrestare un potenziale overflow -> IE che assegna 9 bit in un byte

Un carattere in Java è 2 bytes! Questa logica è lì per fermare un eccesso. Tuttavia, come qualcuno ha sottolineato di seguito, questo è inutile perché il cast lo fa per te. Forse qualcuno era cauto?

+0

non si desidera dividere il carattere in 2 byte per conservare le informazioni. e penso che intendessi i bit – RadioSpace

+0

Assolutamente. Significavo bit – Dudemanword

+0

Non è davvero "buttarli via", i byte sono ancora lì, è solo rendendo il tipo abbastanza piccolo che un cast per un altro tipo non comporterà un overflow. Almeno questo è ciò che il & sta facendo, il cast li getta via se vuoi chiarire. –

2

È un modo per troncare il valore mantenendo solo i bit meno significativi in ​​modo da "adattarsi" in un byte!

Spero che aiuti!

7

In questo caso, è abbastanza inutile, ma il tipo di cose che la gente inserisce "nel caso". Secondo il JLS, 5.1.3. Narrowing Primitive Conversion

Una conversione restringimento di un char a un tipo integrale T similmente semplicemente rigetti tutti ma i bit di ordine n bassi, dove n è il numero di bit usato per rappresentare tipo T. In Oltre a una possibile perdita di informazioni sulla grandezza del valore numerico, questo potrebbe causare il valore risultante per essere un numero negativo, anche se i caratteri rappresentano valori interi senza segno a 16 bit.

Un codice simile è spesso necessario per ampliare le conversioni per sopprimere l'estensione di segno.

+1

Funziona in Java senza maschera/cast, ma non in C#. C# è un po 'più rigoroso sul restringimento delle conversioni. –

+0

@RonBeyer Forse il codice è stato scritto da qualcuno che stava pensando un po 'C# anche se si dice che sia Java. –

+2

Il codice è Java, ma sta convertendo in C#, quindi è solo una cosa importante da notare in quanto non può essere rimosso sul lato C#. –