---------------------------------------------------
1.单字节编码就没有啥编解码问题了
2.多字节编辑码
1)big-endian 低地址存储高位
2)little-endian 低地址存储地位
3)针对不同的方式进行相应的解码就可以得到相应的数据,如果根据相反的方式及得不到相应的解码数据
3.数值的编辑码无非数值的左右移动得到相应的字节,放到相应的位置以及进行|操作
4.根据tcp/ip socket编程内容进行long类型编辑码
package com.pjf.echodemo; import java.io.IOException; import java.math.BigDecimal; public class EncodeDecodeDemo { public static void main(String[] args) throws Exception { long data = 123456787654321l; //以十六进行展示 System.out.println(Long.toHexString(data)); //以二进制展示 System.out.println(Long.toBinaryString(data)); //以十进制展示 System.out.println(printByteDecByLong(data, 1)); System.out.println(printByteDecByLong(data, 0)); System.out.println("==============高低位======================"); //将一个long转成高低位数组 byte[] bytes = longToByteArrayWithBigEndian(data); //以高低位的方式将数据进行解析 System.out.println(readUnsignedLong(byteArrayToLongWithBigEndian(bytes))); System.out.println("==============高低位======================"); System.out.println("==============低高位======================"); //将一个long转成地高位数组 byte[] littleBytes = longToByteArrayWithLittleEndian(data); System.out.println(byteArrayToLongWithLittleEndian(littleBytes)); System.out.println("==============低高位======================"); // System.out.println(byteArrayToLongWithBigEndian(bytes)); // System.out.println(byteArrayToLongWithLittleEndian(bytes)); } /*** * 将一个字节数组以10进制数据展示出来 */ /*** * * @param data * 需要处理的数据 * @param type * 0:小字节序发的方式打印,其他的方式已大字节序方式打印 * @return */ public static String printByteDecByLong(long data, int type) { byte[] bytes = null; if (type == 0) { bytes = longToByteArrayWithLittleEndian(data); } else { bytes = longToByteArrayWithBigEndian(data); } StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(b & 0xff).append(" "); } return sb.toString(); } /** * 将long转成一个字节数组[字节序是大端] 高位在低地址位上 */ public static byte[] longToByteArrayWithBigEndian(long a) { return new byte[] { (byte) ((a >> 56) & 0xFF), (byte) ((a >> 48) & 0xFF), (byte) ((a >> 40) & 0xFF), (byte) ((a >> 32) & 0xFF), (byte) ((a >> 24) & 0xFF), (byte) ((a >> 16) & 0xFF), (byte) ((a >> 8) & 0xFF), (byte) (a & 0xFF) }; } /** * 将long转成一个字节数组[字节序是小端] 高位在低地址位上 */ public static byte[] longToByteArrayWithLittleEndian(long a) { return new byte[] { (byte) (a & 0xFF), (byte) ((a >> 8) & 0xFF), (byte) ((a >> 16) & 0xFF), (byte) ((a >> 24) & 0xFF), (byte) ((a >> 32) & 0xFF), (byte) ((a >> 40) & 0xFF), (byte) ((a >> 48) & 0xFF), (byte) ((a >> 56) & 0xFF) }; } /** * * @param bytes * 字节数 * @return */ public static long byteArrayToLongWithBigEndian(byte[] bytes) { // return b[3] & 0xFF | // (b[2] & 0xFF) << 8 | // (b[1] & 0xFF) << 16 | // b[0] & 0xFF) << 24; return (bytes[0] & (long) 0xFF) << 56 | (bytes[1] & (long) 0xFF) << 48 | (bytes[2] & (long) 0xFF) << 40 | (bytes[3] & (long) 0xFF) << 32 | (bytes[4] & (long) 0xFF) << 24 | (bytes[5] & (long) 0xFF) << 16 | (bytes[6] & (long) 0xFF) << 8 | (bytes[7] & (long) 0xFF) << 0; // long data = 0; // int cnt = 8 - bytes.length; // /**不够位进行补位*/ // int i=0; // for ( i = 0; i < cnt; i++) { // // data = data | (0 & 0xFF) <<( 8 * (8-i)); // } // /*** // * bytes已大端字节序进行转换 // */ // for(int j=0;j<=bytes.length-1;j++){ // // data = data | ((bytes[j] & 0xFF) << (8 * (8-i-j-1))); // // } // return data; } /*** * * @param bytes 字节数据 little-endian * @return */ public static long byteArrayToLongWithLittleEndian(byte[] bytes) { return (bytes[0] & (long) 0xFF) << 0 | (bytes[1] & (long) 0xFF) << 8 | (bytes[2] & (long) 0xFF) << 16 | (bytes[3] & (long) 0xFF) << 24 | (bytes[4] & (long) 0xFF) << 32 | (bytes[5] & (long) 0xFF) << 40 | (bytes[6] & (long) 0xFF) << 48 | (bytes[7] & (long) 0xFF) << 56; } /** * * @param value 有符号的long数据 * @return 将有符号的long类型数据转成无符号的数据 * @throws IOException */ public static final BigDecimal readUnsignedLong(long value) throws IOException { if (value >= 0) return new BigDecimal(value); long lowValue = value & 0x7fffffffffffffffL; return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1)); } }
5.运行结果
6.java数值类型转换规则
如果最初的数值类型是有符号的,那么就执行符号扩展;如果是char类型,那么不管它要被转换成什么类型,都执行零扩展。还有另外一条规则也需要记住,如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度。例如将int型转换成byte型,直接截取int型的右边8位。
以上仅仅作为学习记录!