java中如何让byte[]与string类型转换后,保持不变

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何让byte[]与string类型转换后,保持不变相关的知识,希望对你有一定的参考价值。

android中我从网络(通过图片网址)上获得几张图片后,我想进入下一个activity时,把这几张图片传过去,可是我想以列表list传过去,可是android的activity中intent中只能传arrayList<string>类型,我想将得到的byte【】转换成string后传过去,但到那边不可以用了。public class AnroidTestActivity extends Activity
private EditText imagePathText;
private static final String TAG="DataActivity";
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imagePathText = (EditText) findViewById(R.id.editText1);
imageView=(ImageView)findViewById(R.id.imageView1);

//获取我的宝马车图片
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
String path = imagePathText.getText().toString();
try

byte[] data=NetTool.getImage(path);
System.out.println(data.length);
Bitmap bm=BitmapFactory.decodeByteArray(data, 0, data.length);
imageView.setImageBitmap(bm);
String string=bytesToString(data);

List<String>list=new ArrayList<String>();
list.add(string);
System.out.println("转换后得到的数据:"+list.get(0));
System.out.println("转换后得到的数据:"+list.get(0).length());
Intent intent=new Intent();
intent.putStringArrayListExtra("list", (ArrayList<String>) list);
intent.setClass(AnroidTestActivity.this,TestIntent.class);
startActivity(intent);
catch (Exception e)
Log.i(TAG, e.toString());
Toast.makeText(AnroidTestActivity.this, "获得图片失败", 1).show();


);

// 获取网页源代码


//将byte【】类型转换成string类型
public static String bytesToString(byte[] b)
StringBuffer result = new StringBuffer("");
int length = b.length;
for (int i = 0; i < length; i++)
result.append((char)(b[i] & 0xff));

return result.toString();


public class TestIntent extends Activity
private ImageView imageView;
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
imageView=(ImageView)findViewById(R.id.test_imageView1);
Intent intent=getIntent();
List<String> list=new ArrayList<String>();
list=(ArrayList<String>)intent.getStringArrayListExtra("list");
System.out.println("转换后得到的数据:"+list.get(0));
System.out.println("转换后得到的数据:"+list.get(0).length());
byte[]data= list.get(0).getBytes();
System.out.println(data.length);
Bitmap bm=BitmapFactory.decodeByteArray(data, 0, data.length);
imageView.setImageBitmap(bm);

/** * 将String转为byte数组 */
// public static byte[] stringToBytes(String s, int length)
// while (s.getBytes
//
// ().length < length)
// s += "";
//
// return s.getBytes();
//

String.getBytes()是取决于本地缺省编码的,两边不一样就抓瞎了。你这种情况其实是要传byte[],这样硬生生转成String总觉得太危险,一般的做法是弄成比如Base64这样的7bits编码。现成的有sun.misc.BASE64Encoder和sun.misc.BASE64Decoder。追问

怎么用啊

追答

编码就是
byte[] bs = ...;
BASE64Encoder enc = new BASE64Encoder();
String s = enc.encodeBuffer(bs);
解码就是
String s = ...;
BASE64Decoder dec = new BASE64Decoder();
byte[] newbs = dec.decodeBuffer(s);
不过android下有没有这两个包我不知道,但是Base64的编码解码器源码网上不少,也不是很长,自己加也可以。

参考技术A 建议不要转换成String,图片读取只用byte或者byte[]不会出错。
byte[]转换String时使用举例
byte[] bytes = new byte[](byte) 0x03,(byte) 0x04,;

String targetStr = new String(bytes, "UTF-8")
其中"UTF-8"是转码参数,不写的话会按系统默认转码,这就说明byte[]转换String时,
出现特殊字符,即半角英文 数字 半角符号以外的特殊字符,如汉字 特殊符号等时,
如果编码设定不对的话,二进制编码将无法保持一致。
代码中的方法public static String bytesToString(byte[] b) 应该一样存在这个问题。追问

那应该如何通过intent的来传递图片呢?如果是一张图片可以用byte【】传,可我一次传几张怎么做呀?

追答

你的问题我不是很清楚,你的意思是一次选取多个图形文件传输么?
如果是这个意思的话,有两种办法:
第一种,以单独传送图片的机制 循环发送。
第二种,传送时每个文件中间加特殊分割字段,类似于大型机数据的“数据头”。这时需要接受方有一样的解析方式,按照数据头分割文件。

参考技术B 只是一个思路,你在这个Activity里把流转换成Bitmap,再放到集合里,传过去。

Java中 String与基本数据类型,包装类,char[],byte[]之间的转换

  1. String与基本数据类型,包装类之间的转换。
    String转换为基本数据类型,包装类:调用包装类的parseXxx(str)方法
 String str1="456";
        //string转换为int类型
        int str2 = Integer.parseInt(str1);
        System.out.println(str2);

2.基本数据类型,包装类转换为String:调用String重载的valueOf(xxx)方法。

		int str3=123;
        String str4 = String.valueOf(str3);
        System.out.println(str4);

3.String与char[]数组之间的转换

3.1.String转换为char[] 调用toCharArray()

String s1="helloworld";
        char[] chars = s1.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }

3.2.char[]数组转换为String 调用:String的构造器

 		char[] chars1 = {'h', 'e', 'l', 'l', 'o'};
        String s2=new String(chars1);
        System.out.println(s2);

4.String与byte[] (字节数组)之间的相互转换
4.1.编码:
String 转换为 byte[] :调用String的getBytes()

  		String s1="ab1024程序员";
        byte[] bytes = s1.getBytes();//使用默认的字符集进行转换,我的是UTF-8
        System.out.println(Arrays.toString(bytes));
        输出结果:[97, 98, 49, 48, 50, 52, -25, -88, -117, -27, -70, -113, -27, -111, -104]

		try {
            byte[] gbks = s1.getBytes("gbk");//使用gbk字符集进行编码
            System.out.println(Arrays.toString(gbks));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        输出结果:[97, 98, 49, 48, 50, 52, -77, -52, -48, -14, -44, -79]
        UTF-8 一个汉字代表三个字节 GBK中代表两个字节

4.2.解码:
byte[] 转换为 String :调用String的构造器

		  try {
            byte[] gbks = s1.getBytes("gbk");//使用gbk字符集进行编码
            System.out.println(Arrays.toString(gbks));

            String s2 = new String(bytes);
            System.out.println(s2); 

            String s3 = new String(gbks);//因为这个没有使用默认的字符集,进行解码,所以导致乱码
            System.out.println(s3);
			String gbk = new String(gbks, "gbk");//没有出现乱码,因为编码集和解码集一致!
            System.out.println(gbk);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
       输出结果:ab1024����Ա  
				 ab1024程序员
				 ab1024程序员 

以上是关于java中如何让byte[]与string类型转换后,保持不变的主要内容,如果未能解决你的问题,请参考以下文章

java中int如何转换byte

java怎么将string转换成byte数组

java中String类型的如何转为byte[]

java中String类型的如何转为byte[]

java中byte数组怎么转换成string类型

java中byte[]转换成int