您的位置:澳门402永利com > 操作系统 > java十六进制

java十六进制

发布时间:2019-10-01 15:49编辑:操作系统浏览(74)

    在有些需求当中我们需要抓取字段并且填充到excel表格里面,最后将excel表格转换成pdf格式进行输出,我第一次接触这个需求时,碰到几个比较棘手的问题,现在一一列出并且提供解决方案。

    JAVA 十六进制与字符串的转换,java十六进制

    toHexString
    public static String toHexString(int i)以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。
    如果参数为负,那么无符号整数值为参数加上 232;否则等于该参数。将该值转换为十六进制(基数 16)的无前导 0 的 ASCII 数字字符串。如果无符号数的大小值为零,则用一个零字符 '0' ('u0030') 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。用以下字符作为十六进制数字:
    0123456789abcdef
    这些字符的范围是从 'u0030' 到 'u0039' 和从 'u0061' 到 'u0066'。如果希望得到大写字母,可以在结果上调用 String.toUpperCase() 方法:
    Integer.toHexString(n).toUpperCase()
    参数:
    i - 要转换成字符串的整数。
    返回:
    用十六进制(基数 16)参数表示的无符号整数值的字符串表示形式。
    // 转化字符串为十六进制编码
    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 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) {
    System.out.println(encode("中文"));
    System.out.println(decode(encode("中文")));
    }
    /*
    * 16进制数字字符集
    */
    private static String hexString="0123456789ABCDEF";
    /*
    * 将字符串编码成16进制数字,适用于所有字符(包括中文)
    */
    public static String encode(String str)
    {
    //根据默认编码获取字节数组
    byte[] bytes=str.getBytes();
    StringBuilder sb=new StringBuilder(bytes.length*2);
    //将字节数组中每个字节拆解成2位16进制整数
    for(int i=0;i<bytes.length;i++)
    {
    sb.append(hexString.charAt((bytes[i]&0xf0)>>4));
    sb.append(hexString.charAt((bytes[i]&0x0f)>>0));
    }
    return sb.toString();
    }
    /*
    * 将16进制数字解码成字符串,适用于所有字符(包括中文)
    */
    public static String decode(String bytes)
    {
    ByteArrayOutputStream baos=new ByteArrayOutputStream(bytes.length()/2);
    //将每2位16进制整数组装成一个字节
    for(int i=0;i<bytes.length();i+=2)
    baos.write((hexString.indexOf(bytes.charAt(i))<<4 |hexString.indexOf(bytes.charAt(i+1))));
    return new String(baos.toByteArray());
    }
    第二种方法:
    将指定byte数组以16进制的形式打印到控制台
    复制代码 代码如下:
    package com.nantian.iclient.atm.sdb;

    public class Util {
    public Util() {
    }

    /**
    * 将指定byte数组以16进制的形式打印到控制台
    * @param hint String
    * @param b byte[]
    * @return void
    */
    public static void printHexString(String hint, byte[] b) {
    System.out.print(hint);
    for (int i = 0; i < b.length; i++) {
    String hex = Integer.toHexString(b[i] & 0xFF);
    if (hex.length() == 1) {
    hex = '0' + hex;
    }
    System.out.print(hex.toUpperCase() + " ");
    }
    System.out.println("");
    }

    /**
    *
    * @param b byte[]
    * @return String
    */
    public static String Bytes2HexString(byte[] b) {
    String ret = "";
    for (int i = 0; i < b.length; i++) {
    String hex = Integer.toHexString(b[i] & 0xFF);
    if (hex.length() == 1) {
    hex = '0' + hex;
    }
    ret += hex.toUpperCase();
    }
    return ret;
    }

    /**
    * 将两个ASCII字符合成一个字节;
    * 如:"EF"--> 0xEF
    * @param src0 byte
    * @param src1 byte
    * @return byte
    */
    public static byte uniteBytes(byte src0, byte src1) {
    byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
    _b0 = (byte)(_b0 << 4);
    byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
    byte ret = (byte)(_b0 ^ _b1);
    return ret;
    }

    /**
    * 将指定字符串src,以每两个字符分割转换为16进制形式
    * 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF, 0xD9}
    * @param src String
    * @return byte[]
    */
    public static byte[] HexString2Bytes(String src){
    byte[] ret = new byte[8];
    byte[] tmp = src.getBytes();
    for(int i=0; i<8; i++){
    ret[i] = uniteBytes(tmp[i*2], tmp[i*2+1]);
    }
    return ret;
    }

    }

    十六进制与字符串的转换,java十六进制 toHexString public static String toHexString(int i)以十六进制的无符号整数形式返回一个整数参数的字符串...

    1:excel转pdf出现乱码:

        第一次excel转pdf是成功的,第二次开始后面皆是乱码,是因为我的pdf转excel方法出现的问题,解决办法是采用java自身底层的方法(详见下方代码)。

     public static boolean getLicense() {
            boolean result = false;
            try {
                InputStream is = Thread.currentThread().getContextClassLoader()
                        .getResourceAsStream("license.xml"); //  license.xml应放在..WebRootWEB-INFclasses路径下
                License aposeLic = new License();
                aposeLic.setLicense(is);
                result = true;
            } catch (Exception e) {               
                e.printStackTrace();
            }
            return result;
        }
        
        
        public static void excelTransferPdf(String excelPath,String pdfPath) {
            if (!getLicense()) {
                System.out.println("license faile");
                return;
            }
            
            try {     
                Workbook wb = new Workbook(excelPath);
                FileOutputStream fileOS = new FileOutputStream(new File(pdfPath));
                wb.save(fileOS, com.aspose.cells.SaveFormat.PDF);
                fileOS.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    2:excel转pdf出现折行。

      excel转pdf出现折行的情况非常常见,因为在程序运行过程中很多字段是抓取的,你无法判断你的excel转成pdf会有几页,所以这个时候你就不要随意设置excel的预览格式,将excel的单元格式设置自动换行。

    3:抓取字段显示结果不完整:。

      当你未设置单元格大小而又没有设置单元格自动换行,比如你的A18单元格里面的字段超过了单元格的长度你还没有设置单元格大小而又没有设置单元格自动换行,就将抓取的字段填充在B18单元格里面,那么打印出来的pdf文件A18单元格超出单元格外的内容是不予显示的,此时你要么将抓取字段填充在C18单元格内要么将更改A18单元格格式

    4:excel转PDF字段内容无故中间部分换行:

      这是我碰到的最坑的一个地方,这个时候你只需要在excel单元格里面设置自动换行即可,无需代码强行自动换行(强行换行有可能只出现多行数据只显示一行)。同时你需要如下代码:

    /**
         * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为1,英文字符长度为0.5
         *
         * @param String
         *            s 需要得到长度的字符串
         * @return int 得到的字符串长度
         */
        public static double getLength(String s) {
            double valueLength = 0;
            if (s == null) {
                return 0;
            }
            String chinese = "[u4e00-u9fa5]";
            // 获取字段值的长度,如果含中文字符,则每个中文字符长度为2,否则为1
            for (int i = 0; i < s.length(); i++) {
                // 获取一个字符
                String temp = s.substring(i, i + 1);
                // 判断是否为中文字符
                if (temp.matches(chinese)) {
                    // 中文字符长度为2
                    valueLength += 2;
                } else {
                    // 其他字符长度为1
                    valueLength += 1;
                }
            }
            // 进位取整
            return Math.ceil(valueLength);
        }

        /**
         * 根据字符串长度获取行高
         *
         * @param str
         * @return
         */
        public static Float getRowHeight(String str) {

            Integer lineCount = (int) (getLength(str) / 64) + 1;
            if (str.contains("n")) {
                Integer tempLineCount = 1;
                String[] lines = str.split("n");
                for (String line : lines) {
                    Integer everyLineCount = (int) (getLength(line) / 64) + 1;
                    tempLineCount += everyLineCount;
                }
                lineCount = lineCount >= tempLineCount ? lineCount : tempLineCount;
            }
            Float rowHeight = (float) (lineCount * 20);
            return rowHeight;
        }

    你需要先获取抓取的字符串的长度,然后通过这个方法计算行高,再将excel需要填充的该行用Java代码设置行高(行高单位是像素),但是如果出现我上面说的字段内容无故中间部分换行,那么你获取的行高就会不足,这个时候你需要改动这个地方----->>>>Float rowHeight = (float) (lineCount * X);  x的值一定要设置的大一行,以防出现这种情况!

     

    本文由澳门402永利com发布于操作系统,转载请注明出处:java十六进制

    关键词:

上一篇:初学必备,Learning学习笔记

下一篇:没有了