JAVA获得字符串二进制码的问题 String.getBytes()问题

最近在自己写一个aes加密函数,参考的是php版的加密函数。在加密函数中用到了ord函数获得字符串的二进制码,java中没有这个函数,只能用String.getBytes()获得byte[]数组,再把byte转成int。但是现在有个问题,需要获得二进制码的字符串不是字符集中的字(我试验了好几种字符集),获得的都是问号(应该是中文状态下的问号)的二进制码。有没有直接把String转正byte 或者单字节的char或者int的方法呀。

���N�9__oD��J�这个是字符串 获得的加密结果是这个 只能把这个转换成byte了 就是不知道怎么转呀 用getbytes()获得的�的二进制码 是中文问号的二进制码 有别的方法把这个字符串转换成byte吗。我用byte[] a =(byte[]) str.getbytes();肯定是不行的。

PHP中的汉字部分是由文件的编码决定的。或者说目前PHP的字符串不支持汉字,把汉字看成字节原封不动的输出。Java的字符串支持汉字,要另外注意编码。比如PHP使用GBK编码的文件和java通讯时,Java的字符串就要str.getBytes("GBK");转成字节后参与编码。

另外要注意PHP的MCrypt库没有预置补齐函数和键的处理函数,
PHP在AES编码前,要写好和Java一致的,对键和数据进行相应的补齐和处理。
比如Java的AES/CBC/PKCS5Padding 方式,PHP中就要手工写一个PKCS7补齐的方法,
才可能和Java通讯。追问

现在就是string转字节的时候有问题呀,所有字符集转换这个字符串(���N�9__oD��J�)的时候都无法正确获得它的值。
前边的听懂了,后边的不太懂。

追答

部分字节值是不用来被显示的。比如大于127的值就在大多数字符编码下没法正确显示。
字节作为数据,用于存储,而拿来直接显示。所以你强行逐个显示字节必然会乱码
搞清楚字节和字符的区别。在所在环境下会把每个字节强行转换成本地编码的字符,比如gbk,utf8的字符,当本地字符或当前字体中不含有能代表字节值的字符符号,就会用“问号字符�”代替。
getBytes转成“字节串”后,只参与编码操作,不再直接作为字符显示。显示就必须重新编码。

追问

我不是想用来显示,那个字符转换出来的二进制码是问号的二进制码,不是本来应该有的二进制码。这个字符串是加密后的字符串,我只是想转换成字符串本来应该有的二进制码,不用来显示,用来解密出原本加密的字符串。有没有不被转成问号的方法?android的aes的加密函数调用时的参数不是字符串是转换好的byte[],也不知道是怎么转换的。

追答

上贴就是说这个问题分析显示的原因,判断什么“二进制码”是否一致,不是用肉眼看显示的字符是否一个模样,显示什么都不重要,而是看数值是否一致。你没搞清楚字节和字符,字节串和字符串的区别。就没法把这里搞清楚。加密是针对字节数据的,输入和输出是以字节数据的形式,不关字符串的事情。
这么说吧,String明文转成byte[],byte[]输入AES,AES输出byte[]密文,密文要么用base64编码或二维编码后作为印刷媒介显示,要么不显示。byte[]密文解码byte[]明文,byte[]再转成Sting才可以显示。
数据基础不行就找基础看,不然你好意思让人在这里给你打字出一本教材。

追问

这么点问题我还是了解的,不用看什么教程,我现在就是无法获得密文的真确的二进制码byte[]。不过,好在我用别的方法解决这个问题了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-18
//将字符串转换成二进制字符串
private String StrToBinstr(String telephone) {
String str="ewyuryweu23323";
char[] strChar=str.toCharArray();
String result="";

for(int i=0;i<strChar.length;i++){
System.out.print(strChar[i]+" ");
result +=Integer.toBinaryString(strChar[i])+" ";//这句话
}
return result;
}