Prosty scenariusz: Masz tablicę bajtówDlaczego metoda java Integer.toBinaryString (-128) generuje siedem cyfr?
byte[] message = { 1, 2, 3 };
go wydrukować w formacie binarnym można użyć kodu:
for (byte b : message) {
System.out.println(Integer.toBinaryString(0x100 + b).substring(1));
}
(got that kod z this stack overflow thread)
Uzyskać to wyjście:
00000001
00000010
00000011
Ale jeśli oznaczyć -128 na końcu ...
byte[] message = { 1, 2, 3, -128 };
00000001
00000010
00000011
0000000
WOAH! Siedmiocyfrowy numer binarny? Wyczuwam, że ma to coś wspólnego z dopełnieniem dwójki, ale im więcej próbuję czytać, tym bardziej się mylę. Spodziewałem 10000000
pojawić się w czwartym wierszu zamiast ...
Może ktoś wyjaśnić, dlaczego Integer.toBinaryString
z -128
jest siedem cyfr w stosunkowo prosty sposób?
Ye olde javadoc mówi The unsigned integer value is the argument plus 2^32 if the argument is negative; otherwise it is equal to the argument. This value is converted to a string of ASCII digits in binary (base 2) with no extra leading 0s.
Ale jak powiedziałem ... mnie po prostu myli.
Kontekst całej tej sprawie jest to, że staram się kodowania niektórych funkcji SHA w Javie. Nie pytaj mnie dlaczego, nie wiem nawet ... jestem po prostu ciekawa/sama się podjudzam/denerwuję się :)
Wypełnienie wiadomości do użycia w funkcji SHA-256 (co czyni ją wielokrotnością 512 długości bitów) zgodnie the documentation jest połączeniem:
- pierwotny komunikat
- pojedyncza
1
nieco 0
bitów do ostatnich 64 bitów- długości pierwotnej wiadomości jako 64-bitowa wartość
Ponieważ moje wiadomości najprawdopodobniej będzie w kodach ASCII 8-bitowych, po prostu trzeba oznaczyć w 10000000
dla # 2 ... wtedy mogę po prostu policzyć 0
bajtów dodać, że powinnam Trzeba zaplanować komunikaty, które nie są wielokrotnościami 8. Problem polega na tym, że 10000000
.
Dlatego nie powinienem zezwalać na kodowanie w nocy. Przepraszam za czas marnowania haha – snickers10m