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;
}

求教大神,java中关于String类的getBytes()方法的问题
又byte要显示为1010这种形式,在JAVA的API Byte中是没有提供的,而在Integer中提供有toBinaryString()这个类方法可将一个数字以二进制的方式显示,所以需要将该byte转换为int之后再调用Integer.toBinaryString(int)方法来显示二进制字符串。又“我”的GBK编码是ced2,所以"我来了".getBytes()[0]得到的...

关于java中String.getBytes()问题
getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 当此字符串不能使用默认的字符集编码时,此方法的行为没有指定。如果需要对编码过程进行更多控制,则应该使用 CharsetEncoder 类。http:\/\/www.blogjava.net\/baizhihui19870626\/articles\/388054.ht...

java中文乱码,能说下string.getBytes()和new String()转码是,具体点...
1、Java中,【String.getBytes(String decode)】的方法,会根据指定的decode,编码返回某字符串在该编码下的byte数组表示,例如:byte[] b_gbk = "中".getBytes("GBK");byte[] b_utf8 = "中".getBytes("UTF-8");byte[] b_iso88591 = "中".getBytes("ISO8859-1")上面三行代码表示:分别...

java中String.getBytes()的用法
str.getBytes() 返回一个字节数组 调用一次返回的都是一个新的数组对像, 你打印的是对象引用的哈希码(不是对像里面的内容),肯定是不一样的(因为每次返回都是一个新的变量).他们的内容是一样的.

求教大神,java中关于String类的getBytes()方法的问题
看了下,也测试了一把,“我来了”的GBK十六进制编码是CED2 C0B4 C1CB 在Java语言中,对于byte、short等整形数据,它的控制台输出都是10进制的,getBytes()[0]的byte十六进制显示为CE,转换成10进制就是-50,所以控制台打印的是-50。

java中调用String中的getBytes()得到的是byte数组,把他赋给一个数组b...
你需要在Demo中重写object类里的方法,才能比较数组里的属性是否相等。否则equals==,比较的都是地址值,因为地址值不同得到的都是false。

java中String对象的getBytes方法是干什么的?
String的getBytes()方法是得到一个系统默认的编码格式的字节数组 getBytes("utf-8") 得到一个UTF-8格式的字节数组 如果你的java指定UTF-8编码则两个方法返回的数组一样。如果你java工程是GBK的两个方法返回不同。

从String.getBytes 理解 Java 编码和解码
Java中,字符串的存储和转换涉及编码和解码的概念。原码、补码和反码是二进制表示数值的基本方式,但在这里,我们关注的是Unicode编码和UTF-8编码规则。Unicode定义了字符的码点,如"赵"的码点为8D75和4E14,而UTF-8则是将这些码点转换为二进制序列的编码方式。内存中的Java字符串使用Unicode编码,可以...

java中的String的getBytes()方法可以获取3个byte,那么如果知道3个byt...
String s = new String(byte[] b);就得到一个汉字了。如果出来的汉字有乱码,可以设置编码:String s = new String(byte[] b,String charset);

从零开始学Java—String字符串的编码
深入理解Java中的String字符串编码,是开发中常遇到的问题,尤其是中文乱码问题。今天将揭示其背后原理并提供解决方案。首先,字符编码是计算机与人类可读数据之间的桥梁,它将字符映射为二进制数据。例如,ASCII编码以单字节表示,包括字母、数字和符号,而Unicode编码则更全面,可能需要多个字节。常见的中文...

相似回答