作者phstudy (study)
看板java
標題Re: [問題] 使用JAVA API寫AES加密器的問題
時間Mon Dec 10 03:00:51 2012
: 我試過 byte[] key = 字串.getBytes(); 這方法,不過好像不對,變成只要輸入
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
key陣列中儲存的會是每個字元透過預設字元集轉換後的結果
假設預設字元集為MS950
byte[] key = "00000001".getBytes() ,會返回長度為8的byte array
key[0]~[6]均是48 // ASCII value 48代表字元0
key[7]是49
而你想要的結果是
byte[] key = "00000001".getXXX() ,返回長度為1的byte array
且key[0]的值要是1
做法上可先將 字串 拆開為每8個字元一組,每一組代表一個8bits String
再將8bits String轉換為byte
具體實作如下:
String keyString = "10000000";
String[] byteStrings = new String[keyString.length() / 8];
byte[] key = new byte[byteStrings.length];
int curpos;
final int bitsPerByte = 8;
for(int i = 0; i < byteStrings.length; i++) {
curpos = i * 8;
byteStrings[i] = keyString.substring(curpos, curpos + bitsPerByte);
}
for(int i = 0; i < byteStrings.length; i++) {
/*
java中byte是以signed two's complement來儲存
故需透過Integer.parseInt將8bits String轉換為int, 再把int轉為byte
直接用Byte.parseByte, 會導致值超出byte可以表示的範圍(-128~127)
如:10000001(binary) = 129(decimal)
補充:int 轉 byte
129(decimal)以int存在記憶體中會是00000...10000001 (共32 bits)
轉成byte時會直接截掉int的前三個bytes, 變成10000001 (8 b1ts)
*/
byte eachByte = (byte)Integer.parseInt(byteStrings[i], 2);
key[i] = eachByte;
}
另外也可以用bitwise的方式來做~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.193.183.7
推 sunsam777:可以了耶 不過bitsPerByte好像是7 12/10 22:00
→ sunsam777:eachByte 是不是多餘的@@ 感謝您的大力協助 12/10 22:02
推 sunsam777:懂了 bitsPerByte是8 @@ 12/11 03:40