Java中字符串与byte数组之间的相互转换_java

前言

Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成byte数组型,java在字符与数组转换也是非常方便的。下面跟我一起来了解一下字符串与byte之间转换的原理

原理

我们都知道,在Java里byte类型是占用1个字节,即8位的,而16进制的字符占用4位,所以每个byte可以用两个字符来表示,反之亦然。

举个例子

byte = 123

用二进制表示:0111 1011

每4位用字符表示: 7 b

是的,原理就这么简单,接下来用代码实现:

byte[] 转16进制字符串

方法一

思路:先把byte[] 转换维char[] ,再把char[] 转换为字符串

 public static String bytes2Hex(byte[] src) {
  if (src == null || src.length <= 0) {
   return null;
  } 

  char[] res = new char[src.length * 2]; // 每个byte对应两个字符
  final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  for (int i = 0, j = 0; i < src.length; i++) {
   res[j++] = hexDigits[src[i] >> 4 & 0x0f]; // 先存byte的高4位
   res[j++] = hexDigits[src[i] & 0x0f]; // 再存byte的低4位
  }

  return new String(res);
 }

方法二

思路:先把byte转换为int类型,再转换为字符串

 public static String bytesToHex(byte[] src){
  if (src == null || src.length <= 0) {
   return null;
  } 

  StringBuilder stringBuilder = new StringBuilder("");
  for (int i = 0; i < src.length; i++) {
   // 之所以用byte和0xff相与,是因为int是32位,与0xff相与后就舍弃前面的24位,只保留后8位
   String str = Integer.toHexString(src[i] & 0xff);
   if (str.length() < 2) { // 不足两位要补0
    stringBuilder.append(0);
   }
   stringBuilder.append(str);
  }
  return stringBuilder.toString();
 }

16进制字符串转byte[]

思路:先把字符串转换为char[] ,再转换为byte[]

 public static byte[] hexToBytes(String hexString) {
  if (hexString == null || hexString.equals("")) {
   return null;
  } 

  int length = hexString.length() / 2;
  char[] hexChars = hexString.toCharArray();
  byte[] bytes = new byte[length];
  String hexDigits = "0123456789abcdef";
  for (int i = 0; i < length; i++) {
   int pos = i * 2; // 两个字符对应一个byte
   int h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1
   int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2
   if(h == -1 || l == -1) { // 非16进制字符
    return null;
   }
   bytes[i] = (byte) (h | l);
  }
  return bytes;
 }

注:注1得到xxxx0000,注2得到0000xxxx,相或就把两个字符转换为一个byte了。

再举个例子

md5加密

 public static String getMd5ByFile(File file) {
  String ret= null;
  FileInputStream fis = null;
  try {
   fis = new FileInputStream(file);
   MessageDigest md = MessageDigest.getInstance("MD5");
   byte[] buffer = new byte[1024];
   int len;
   while((len = fis.read(buffer)) > 0) {
    md.update(buffer, 0, len);
   }
   ret = bytes2Hex(md.digest()); // 把md5加密后的byte[]转换为字符串
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if(fis != null) {
    try {
     fis.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }

  return ret;
 }

总结

好了,应该懂了吧,其实并不难的。以上就是这篇文章的全部内容了,希望这篇文章的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 字符串
, byte
字符串转byte
java字符串转byte数组、java 字符串 byte数组、c 字符串转byte数组、字符串转byte数组、ios字符串转byte数组,以便于您获取更多的相关知识。

时间: 2024-11-01 22:15:38

Java中字符串与byte数组之间的相互转换_java的相关文章

java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做?

问题描述 java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做? java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做? 解决方案 http://blog.csdn.net/shuaihj/article/details/7478773http://blog.csdn.net/abin_gha/article/details/6317850 解决方案二: java中String类有getBytes方法,可以将字符串转成字节数组.字节数组可以直接写入到输出流中,

跪求C#下如何实现自定义结构或类与BYTE数组之间的相互转换(即数据的打包与解包)?

问题描述 请教C#下如何实现自定义结构或类与BYTE数组之间的相互转换(即数据的打包与解包)?在C#定义类似如下的结构和类:[Serializable][StructLayout(LayoutKind.Sequential,Pack=1)]publicstructSTCord{publicdoublex;//publicdoubley;publicbytetype;publicintnum;};[Serializable][StructLayout(LayoutKind.Sequential,P

Java基本类型与byte数组之间相互转换方法_java

Java基本类型与byte数组之间相互转换,刚刚写的 package cn.teaey.utils; import java.nio.charset.Charset; public class ByteUtil { public static byte[] getBytes(short data) { byte[] bytes = new byte[2]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data & 0xff00)

Java中字符串的一些常见方法分享_java

1.Java中字符串的一些常见方法 复制代码 代码如下: /** *  */package com.you.model; /** * @author Administrator * @date 2014-02-24 */public class Replace {  /**  * @param args  */ public static void main(String[] args)  {  /**   * 原字符串   */  String str = "78454545855ksdjnf

Javascript中字符串与字符数组之间的转换示例

1.string to array js里的string和java中的一样,都是不可变的常量. 早期的ECMAScript标准将string解析为不可变的字符数组, 支持str[index]这样的访问方式. 直到今天firefox仍然支持, 但IE不行. 我知道两种可以将字符串转换为数组的方法. 第一种很容易想到:使用charAt. Javascript代码: function toArray(str){     if(typeof str !="string"){         r

Java中字符串拼接的一些细节分析_java

工作日忙于项目的逻辑实现,周六有点时间,从书柜里拿出厚厚的英文版Thinking In Java,读到了字符串对象的拼接.参考着这本书做个翻译,加上自己思考的东西,写上这篇文章记录一下. 不可变的String对象 在Java中,String对象是不可变的(Immutable).在代码中,可以创建多个某一个String对象的别名.但是这些别名都是的引用是相同的. 比如s1和s2都是"droidyue.com"对象的别名,别名保存着到真实对象的引用.所以s1 = s2 复制代码 代码如下:

JAVA中字符串函数subString的用法小结_java

String str;str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str; demo: 复制代码 代码如下: class Test { public static void main(String[] args)

java中字符串与日期的转换实例_java

复制代码 代码如下: import java.sql.Timestamp;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateIO { public static void main(String[] args) { Date date= new  DateIO().strTo

[细说Java](2)Java中字符串为什么是不可变的

在Java中字符串(String)是一个不可改变的类.一个不可改变的类只是一个对象实例不可修改的简单类.当创建一个对象实例时,对象实例的所有信息都被初始化,并且信息不能被修改.对于不可改变的类来说还有很多优势.上一篇文章很好说明了为什么字符串被设计成不可改变的.只有你很好的掌握了内存,同步,数据结构等知识后,你才能很好的回答这个问题. 1. 字符串常量池的需求 字符串常量区是方法区(Method Area)中一块特殊的存储区域.当一个字符串被创建,如果该字符串已经存在字符串常量区时,相应的返回存