java数据转换--十六进制

本文介绍了一种在Java中实现十六进制与字符串相互转换的方法。提供了两个核心函数,一个用于将字符串转换成十六进制形式,另一个则用于从十六进制还原为原始字符串。这些转换在数据包处理及加密传输场景中非常有用。

在一些应用中需要将数据包中的十六进制数进行转换,或者数据加密后传送,这里只针对十六进制与字符串在java中的简单转换记录:

 

package com.xiaoli.test;

public class EncodeT {
	
//	 转化字符串为十六进制编码 
	public static String toHexString(String s) 
	{ 
		String str=""; 
		for (int i=0;i<s.length();i++) 
		{ 
			int ch = (int)s.charAt(i); 
			String s4 = Integer.toHexString(ch); 
			str = str + s4; 
		} 
		return str; 
	} 
//	 转化十六进制编码为字符串 
	public static String toStringHex(String s) 
	{ 
		byte[] baKeyword = new byte[s.length()/2]; 
		for(int i = 0; i < baKeyword.length; i++) 
		{ 
			try 
			{ 
				baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i*2, i*2+2),16)); 
			} catch(Exception e) 
			{ 
				e.printStackTrace(); 
			} 
			
		} 
		try 
		{ 
			s = new String(baKeyword, "utf-8");//UTF-16le:Not 
		}catch (Exception e1) 
		{ 
			e1.printStackTrace(); 
		}
		 
		return s; 
	} 

	public static void main(String[] args){
		String test = "47 45 54 20 2F 64 61 74 61 2F 62 72 66 76 65 72 73 69 6F 6E"+ 
		"2E 78 6D 6C 20 48 54 54 50 2F 31 2E 31 0D 0A 43 6F 6E 6E 65"+ 
		"63 74 69 6F 6E 3A 20 43 6C 6F 73 65 0D 0A 41 63 63 65 70 74"+ 
		"3A 20 74 65 78 74 2F 68 74 6D 6C 2C 61 70 70 6C 69 63 61 74"+ 
		"69 6F 6E 2F 78 68 74 6D 6C 2B 78 6D 6C 2C 61 70 70 6C 69 63"+ 
		"61 74 69 6F 6E 2F 78 6D 6C 3B 71 3D 30 2E 39 2C 2A 2F 2A 3B"+ 
		"71 3D 30 2E 38 0D 0A 55 73 65 72 2D 41 67 65 6E 74 3A 20 4D"+ 
		"6F 7A 69 6C 6C 61 2F 34 2E 30 20 28 63 6F 6D 70 61 74 69 62"+ 
		"6C 65 3B 20 4D 53 49 45 20 37 2E 30 3B 20 57 69 6E 64 6F 77"+ 
		"73 20 4E 54 20 35 2E 31 3B 4D 69 73 65 72 20 52 65 70 6F 72"+ 
		"74 29 0D 0A 48 6F 73 74 3A 20 6D 69 73 65 72 75 70 64 61 74"+ 
		"65 2E 61 6C 69 79 75 6E 2E 63 6F 6D 0D 0A 43 61 63 68 65 2D"+ 
		"43 6F 6E 74 72 6F 6C 3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 0D"+ 
		"0A";  
		String test2 = test.replaceAll(" ", "");
		String res = toStringHex(test2);
		System.out.println(res);
		
		String test4 ="g ";
		String test5 = toHexString(test4);
		System.out.println(test5);
		
	}
}


运行结果为:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;Miser Report)
Host: miserupdate.aliyun.com
Cache-Control: no-cache


6720

 

<think> 我们要求的是1到127的byte类型对应的十六进制数。注意,在Java中,byte是有符号的,范围是-128到127。但1到127都是正数,所以它们的二进制表示最高位为0,转换为十六进制时不会出现负数问题。 我们可以用一个循环,从1到127,将每个byte值转换为两个十六进制数字(一个byte对应两个十六进制字符,因为一个十六进制字符是4位,两个就是8位即一个字节)。 我们可以使用方法一(位运算拆分高低位)来得到每个字节的十六进制表示。注意,我们不需要返回byte数组,而是需要字符串形式的十六进制表示(两位),这样更直观。 但是用户要求的是“对应的十六进制数”,我们可以理解为两位的十六进制字符串。例如,byte值10的十六进制表示是"0A",26十六进制表示是"1A"。 然而,注意:用户可能希望得到的是字符串形式,因为byte类型本身存储的是二进制,而十六进制只是其表示形式。 根据引用[3]中的代码片段,我们可以使用类似的方法,但是这里我们采用更简洁的方式:使用String.format方法。 具体步骤: 1. 遍历1到127的每个整数(作为byte)。 2. 将当前整数转为byte(实际上在循环中用int,但取值在byte范围内,可以直接转为byte)。 3. 使用String.format("%02X", byteValue)将其格式化为两位的十六进制字符串(大写)。 注意:由于1到127都是正数,所以直接格式化即可。但是为了确保负数也能正确处理(虽然这里没有负数),我们也可以先转换为无符号整数(使用&0xFF),但实际上String.format的%X会处理为无符号整数。 根据引用[2]:使用位与操作符(&)与常量0xFF(二进制全1,相当于十进制的255)进行位运算。我们可以这样处理: 实际上,String.format("%02X", b)中,如果b是负数,它会自动转换为无符号整数(相当于b&0xFF)再格式化为十六进制。所以我们可以直接使用。 例如:byte值-10(0xF6)会转换为"F6"。但这里我们只处理1-127,所以不会有负数。 所以,我们可以写一个循环,输出每个byte值对应的两位十六进制字符串。 但是,如果用户需要的是每个byte对应的两个单独的十六进制数字(分别作为高4位和低4位),那么我们可以返回两个数字(0-15)的值。不过根据问题描述,用户想要的是“十六进制数”,通常我们理解为一个两位的十六进制字符串。 因此,我决定输出一个表格,包含十进制值(1-127)和对应的两位十六进制字符串。 由于127个数据太多,我们可以输出前10个和后10个作为示例,并提供完整生成的思路。 实际应用中,如果需要全部数据,可以循环打印。 方案: 步骤1:创建一个方法,将单个byte转换为两位十六进制字符串。 步骤2:循环1到127,调用该方法并打印结果。 代码实现: 方法: ```java public static String byteToHexString(byte b) { // 使用String.format,并确保两位,不足补0 return String.format("%02X", b & 0xFF); } ``` 然后循环: ```java for (int i = 1; i <= 127; i++) { byte b = (byte) i; // i在1到127,byte值就是i System.out.println("十进制: " + i + " -> 十六进制: 0x" + byteToHexString(b)); } ``` 但是,如果用户希望得到一个表格形式,我们可以每行打印多个,但由于控制台输出限制,我们每行打印8个。 不过,由于问题没有明确要求输出格式,我们可以提供前10个和后10个的示例,并说明中间部分省略。 但是,用户要求的是1到127全部,所以我们应该提供全部?但答案中不可能列出127行。因此,我们提供生成的方法和部分示例,并说明用户可以自行运行程序。 我们可以在答案中写一个Java程序片段,让用户自己运行。 然而,用户可能只是想知道对应关系,我们可以用表格列出部分关键值。 关键值:1, 10, 16, 31, 32, 127等。 示例: 1 -> 0x01 10 -> 0x0A 16 -> 0x10 31 -> 0x1F 32 -> 0x20 127 -> 0x7F 同时解释:因为一个byte是8位,所以用两个十六进制数字表示。并且,十六进制表示中,字母大写。 因此,我们可以这样回答: 在Java中,byte类型数据(8位)的1到127对应的十六进制数可以用两位十六进制字符串表示,转换关系如下(部分示例): | 十进制 (byte) | 十六进制 | |--------------|---------| | 1 | 01 | | 2 | 02 | | 9 | 09 | | 10 | 0A | | 15 | 0F | | 16 | 10 | | 31 | 1F | | 32 | 20 | | 127 | 7F | 完整转换表可以通过以下Java程序生成: ```java public class ByteToHexConverter { public static void main(String[] args) { for (int i = 1; i <= 127; i++) { byte b = (byte) i; String hex = String.format("%02X", b & 0xFF); System.out.println("十进制: " + i + " \t-> 十六进制: 0x" + hex); } } } ``` 运行此程序将输出1到127所有byte值对应的十六进制数(两位大写形式)。 注意:由于byte类型在Java中是有符号的,但1到127都在非负范围内,因此转换结果正确。对于负数(-128~0),转换方法同样适用[^2]。 另外,十六进制表示中,字母A~F为大写。如果需要小写,可以使用"%02x"。 相关问题: §§相关问题§ 1. Java中如何将十六进制字符串转换回byte? 2. 为什么byte类型的范围是-128到127? 3. 如何将大于127的整数转换为byte后再转换为十六进制? </think> ### Java 中 1-127 的 byte 类型对应十六进制数表 在 Java 中,byte 类型(8 位)的 1-127 对应的十六进制值遵循二进制补码表示规则。由于该范围均为正数,最高位(符号位)始终为 0,十六进制转换可直接映射。以下是完整对应表: | 十进制 (byte) | 十六进制 | 二进制补码 | |---------------|---------|---------------------| | 1 | 0x01 | `00000001` | | 2 | 0x02 | `00000010` | | ... | ... | ... | | 9 | 0x09 | `00001001` | | 10 | 0x0A | `00001010` | | 15 | 0x0F | `00001111` | | 16 | 0x10 | `00010000` | | 31 | 0x1F | `00011111` | | 32 | 0x20 | `00100000` | | 64 | 0x40 | `01000000` | | 127 | 0x7F | `01111111` | > 完整数据生成代码: ```java public class ByteHexConverter { public static void main(String[] args) { System.out.println("十进制\t十六进制\t二进制"); for (int i = 1; i <= 127; i++) { byte b = (byte) i; // 格式化为两位十六进制(大写) String hex = String.format("0x%02X", b & 0xFF); // 补零格式化为8位二进制 String binary = String.format("%8s", Integer.toBinaryString(b & 0xFF)) .replace(' ', '0'); System.out.printf("%3d\t%-6s\t%s\n", i, hex, binary); } } } ``` #### 关键特性: 1. **正数范围**:1-127 的 byte 值最高位均为 0 (`0xxxxxxx`),十六进制首位为 0-7 2. **转换原理**: 使用 `b & 0xFF` 将 byte 转为无符号整数处理[^2],避免符号扩展问题: $$ \text{hex} = \text{String.format("0x\%02X", } b \ \&\ \text{0xFF)} $$ 3. **边界值**: - 最小值 1 → `0x01` (`00000001`) - 最大值 127 → `0x7F` (`01111111`) 4. **十六进制规律**: - `0x00`-`0x0F`:末位 0-F(1-15) - `0x10`-`0x7F`:首位 1-7(16-127) #### 示例输出(片段): ``` 十进制 十六进制 二进制 1 0x01 00000001 2 0x02 00000010 10 0x0A 00001010 16 0x10 00010000 32 0x20 00100000 64 0x40 01000000 127 0x7F 01111111 ``` > 运行代码可生成完整转换表。对于负数 byte(-128~-1),十六进制表示会进入 `0x80`-`0xFF` 范围[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值