Javaと中国の進文字列(文字列)システムの変換と変換文字化け概要

/**
	 * 16进制直接转换成为字符串(无需Unicode解码)
	 * @param hexStr  Byte字符串(Byte之间无分隔符
	 * @author xxs
	 * @return 对应的字符串
	 */
	public static String hexStr2Str(String hexStr) {
		String str = "0123456789ABCDEF"; //16进制能用到的所有字符 0-15
		char[] hexs = hexStr.toCharArray();//toCharArray() 方法将字符串转换为字符数组。
		int length = (hexStr.length() / 2);//1个byte数值 -> 两个16进制字符
		byte[] bytes = new byte[length]; 
		int n;
		for (int i = 0; i < bytes.length; i++) {
			int position = i * 2;//两个16进制字符 -> 1个byte数值
			n = str.indexOf(hexs[position]) * 16;
			n += str.indexOf(hexs[position + 1]);
			// 保持二进制补码的一致性 因为byte类型字符是8bit的  而int为32bit 会自动补齐高位1  所以与上0xFF之后可以保持高位一致性 
			//当byte要转化为int的时候,高的24位必然会补1,这样,其二进制补码其实已经不一致了,&0xff可以将高的24位置为0,低8位保持原样,这样做的目的就是为了保证二进制数据的一致性。
			bytes[i] = (byte) (n & 0xff);
		}
		return new String(bytes);
	}
	/**
	 * 字符串转换成为16进制(无需Unicode编码)
	 * @param str 待转换的ASCII字符串
	 * @author xxs
	 * @return byte字符串 (每个Byte之间空格分隔)
	 */
	public static String str2HexStr(String str) {
		 char[] chars = "0123456789ABCDEF".toCharArray();//toCharArray() 方法将字符串转换为字符数组。
		 StringBuilder sb = new StringBuilder(""); //StringBuilder是一个类,可以用来处理字符串,sb.append()字符串相加效率高
		 byte[] bs = str.getBytes();//String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组
		 int bit;
		 for (int i = 0; i < bs.length; i++) {
			bit = (bs[i] & 0x0f0) >> 4; // 高4位, 与操作 1111 0000
		 	sb.append(chars[bit]);
		 	bit = bs[i] & 0x0f;  // 低四位, 与操作 0000 1111
		 	sb.append(chars[bit]);
		 	sb.append(' ');//每个Byte之间空格分隔
		 }
		 return sb.toString().trim();
	}

テストの主な方法を記述します。

 

あなたはゴミ問題があり、それは形式を符号化する効果が。例えば:

通常の状況下では、テストの主な方法:

しかし、ブラウザのアドレスバーの着信の後ろに:

での結果:

インベントリデータが正確であるが(最初のテストトレースよりも低いが、問題は同じです)。

しかし、名前が実際に存在するデバイスは、この次のとおりです。

str.getBytesで();プラスのようなフォーマットをコード - > str.getBytes( "UTF-8");

このOKのよう。

以下を参照してください。

この変更のように、実際には、コマンドクエリや歪みを使用してもしかし、問題があります。次の例

クエリがある場合には、順番に、メソッドを使用進数文字列は、中国hexStr2Strを有効にすること。

パケットの名前を取得するには、「e68a80e69cafe983a8e997a8e99481」であります

サンプルコード変調方式:System.out.printlnは( "私はそれ中国を取得しています......" + hexStr2Str( "e68a80e69cafe983a8e997a8e99481"));

オリジナル印刷方法はこれです:

プロジェクト内のゴミを見つけるために繰り返し試みた後、2があり、

1. ABCDEF文字化けします小文字で表示された場合は、

2.new文字コード形式が文字化け(時間)を増加させないであろう。

次のようにこのように、中国の進ストリング転送の方法を改善します。

/**
	 * 16进制直接转换成为字符串(无需Unicode解码)
	 * @param hexStr  Byte字符串(Byte之间无分隔符
	 * @author xxs
	 * @return 对应的字符串
	 */
	public static String hexStr2Str(String hex) {
		String hexStr = "";
		String str = "0123456789ABCDEF"; //16进制能用到的所有字符 0-15
		for(int i=0;i<hex.length();i++){
			String s = hex.substring(i, i+1);
			if(s.equals("a")||s.equals("b")||s.equals("c")||s.equals("d")||s.equals("e")||s.equals("f")){
				s=s.toUpperCase().substring(0, 1);
			}
			hexStr+=s;
		}
		
		char[] hexs = hexStr.toCharArray();//toCharArray() 方法将字符串转换为字符数组。
		int length = (hexStr.length() / 2);//1个byte数值 -> 两个16进制字符
		byte[] bytes = new byte[length]; 
		int n;
		for (int i = 0; i < bytes.length; i++) {
			int position = i * 2;//两个16进制字符 -> 1个byte数值
			n = str.indexOf(hexs[position]) * 16;
			n += str.indexOf(hexs[position + 1]);
			// 保持二进制补码的一致性 因为byte类型字符是8bit的  而int为32bit 会自动补齐高位1  所以与上0xFF之后可以保持高位一致性 
			//当byte要转化为int的时候,高的24位必然会补1,这样,其二进制补码其实已经不一致了,&0xff可以将高的24位置为0,低8位保持原样,这样做的目的就是为了保证二进制数据的一致性。
			bytes[i] = (byte) (n & 0xff);
		}
		String name = "";
		try {
			name = new String(bytes,"UTF-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return name;
	}

このようなものをプリントアウト:

完全にゴミ問題を解決します。

 

 

 

 

 

 

公開された141元の記事 ウォン称賛33 ビュー50000 +

おすすめ

転載: blog.csdn.net/qq_43560721/article/details/102664784