这几天在弄打印的相关事情,由于打印的内容是从服务端传递过来的,服务端是使用的C#,在C#中是有一些关于报表的控件的,通过这个控件可以直接生产成一个打印的报表,这个打印的报表就是我所需要的内容(因为这个报表中有一些C#自己设置的模板),最后决定把这个报表按照图片传递过来。但是这个图片在服务端存储的是十六进制的字符串,所以在android端只能通过解析这个字符串为字节数组,再把这个字节数组通过BitmapFactory.decodeByteArray()方法转为一张bitmap图片,此为图片转化的全部流程。
以下是转化的代码:
在传递回来的string字符串中有0x开头的,需要去掉这个在进行转化
如:string str = “0xFF12D0A5571782………..”这个返回的str就是有0x的。需改为str = “FF12D0A5571782………..”这样的才可以使用下面的方法。

* 十六进制字符串转化为数组 public static byte [] stringToByte (String str) { if (str == null ) { return null ; int length = str.length() / 2 ; byte [] bytes = new byte [length]; for ( int i = 0 ; i < length; i++) { bytes[i] = ( byte ) ((Character.digit(str.charAt(i * 2 ), 16 ) << 4 ) | Character.digit(str.charAt((i * 2 ) + 1 ), 16 )); return bytes;

其中digit方法:查看这个char的内容是不是当前进制(radix)的数值
static int digit(char ch, int radix) :根据基数返回当前字符的值的十进制。如果不满足Character.MIN_RADIX <= radix <= Character.MAX_RADIX,或者,ch不是radix基数中的有效值,返回”-1”;如果ch是“大写”的A到Z之间,则返回ch - ‘A’ + 10 的值;如果是“小写”a到z之间,返回ch - ‘a’ + 10 的值。
代码:
System.out.println(“Character.MIN_RADIX: ” + Character.MIN_RADIX );
System.out.println(“Character.MAX_RADIX: ” + Character.MAX_RADIX );
System.out.println(“Character.digit(‘2’,2): ” + Character.digit(‘2’,2) );
System.out.println(“Character.digit(‘7’,10): ” + Character.digit(‘7’,10) );
System.out.println(“Character.digit(‘F’,16): ” + Character.digit(‘F’,16) );
结果为:
Character.MIN_RADIX: 2
Character.MAX_RADIX: 36
Character.digit(‘2’,2): -1 不是有效值。
Character.digit(‘7’,10): 7
Character.digit(‘F’,16): 15

下面是字节数组转化为十六进制

* 字节数组转为十六进制 public static String bytesToHexString ( byte [] src) { if (src == null || src.length <= 0 ) { return null ; StringBuilder stringBuilder = new StringBuilder( "" ); for ( int i = 0 ; i < src.length; i++) { int v = src[i] & 0xFF ; String hv = Integer.toHexString(v); if (hv.length() < 2 ) { stringBuilder.append( 0 ); stringBuilder.append(hv); return stringBuilder.toString(); /*16进制 byte 数组 转String*/ public static String byte s2HexString( byte [] b) { String r = ""; for (int i = 0; i < b.length; i++) { /*** 将 图片 转换成 十六进制 字符串 * @param photo* @return*/public static String sendPhoto(ImageView photo) {Drawable d = photo.getDrawable();Bitmap bitmap=((BitmapDrawable)d).getBitmap(); Byte ArrayOutputStream stream ... data = data.toUpperCase(); // 转化 为大写 int len = data.length()/2; byte [] sendData = new b... procedure Hex2Png(str: string; outpng: TPngObject);varstream: TMemoryStream;beginif not Assigned(png) then png := TPngObject.Create;stream := TMemoryStream.Create;stream.SetSize(Length(str)div 2);HexT... 图片 数据是验主码 TCP服务端返回的数据是下面这个.下面是16进制的数据:2F396A2F34414151536B5A4A5267414241674141415141424141442F327742444141674742676347425167484277634A4351674B4442514E4441734C44426B534577385548526F66486830615C6E4842776... try { fis = new FileInputStream("water_mark_logo.png"); Byte ArrayOutputStream bos = new Byte ArrayOutput public static byte [] HexStringTo Byte Array(String hexString){ //hexString的长度对2取整,作为 byte s的长度 int len = h... 想起前段时间的物联网的外包开发,经常遇到通过wifi接受的数据,要通过转换成 十六进制 字符串 ,或者最后又是十进制数据。都是根据双方的协议来开发的。那么我发送过去的数据也需要,经过特殊转换成 byte 字节发过去,硬件那边收到不至于乱码的数据。 1、硬件调试发给 android 这边是 十六进制 数据 原始数据:68 38 38 68 A 72 78 55 34 12 43 23 01 07 Y 00 00 0... 原文:http://www.cppblog.com/magicqy/archive/2009/02/16/73975.html BMP文件是一种像素文件,它保存了一幅图象中所有的像素。这种文件格式可以保存单色位图、16色或256色索引模式像素图、24位真彩色图象,每种模式种单一像素的大小分别为1/8字节,1/2字节,1字节和3字节。目前最常见的是256色BMP和24位色BMP。这种文件格式还定义... #3////////////////////////////////////////////////////////////////Name:bmp.c//Purpose:Toopenabitmapfileanddisplayitonscreen.//Author:phoenix,CS,TshingHua,Beijing,P.R.C//Email:bjlufengj...