`
pengjianf_ah
  • 浏览: 8556 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java基本类型编解码

阅读更多
java 基本类型编解码
---------------------------------------------------
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位。



以上仅仅作为学习记录!

  • 大小: 31.3 KB
分享到:
评论

相关推荐

    h264编解码(代码)

    本篇文章将深入探讨H264编解码的原理,并通过使用开源工具FFmpeg进行实践操作,提供源代码分析,以便于开发者更好地理解和应用。 H264编码的核心在于通过一系列复杂的算法,减少视频数据中的冗余信息,以达到在保持...

    H.264视频编解码.zip

    2.JNI接口:为了提高性能,通常会将关键的编解码操作封装在C/C++层,通过JNI(Java Native Interface)与Java层交互。这样可以利用硬件加速,提高解码速度。 3. 硬件解码支持:现代安卓设备通常具备硬件解码H.264的...

    SNMP数据编码解码的java实现

    描述了基于SNMP协议的常用数据类型的种类及特性,按照ASN.1语法对管理信息库中悲观对象编码、解码的基本规则,用Java语言给予了实现。

    用java写的PNG编码与解码小程序

    在本项目中,开发者使用Java编写了一个小程序,实现了PNG图像的基本编解码功能。虽然这个小程序可能并不完美,存在一些算法不强大和已知的BUG,但它为理解PNG编解码原理和Java图形处理提供了基础示例。下面我们将...

    wav文件读取与G.711编解码

    开发者需要解析这些块来获取音频流的基本信息,如文件类型、数据长度、采样率、位深度和声道数等。 2. **数据读取**:解析完文件头后,可以跳过数据头并直接读取音频样本。音频样本通常是连续的整数或浮点数,代表...

    应用源码H.264视频编解码.zip

    通过学习这个源码项目,开发者不仅可以掌握H.264视频编解码的基本原理,还能了解如何在Android平台上实际应用这些知识,提升解决实际问题的能力。同时,这也是一个很好的实践机会,可以锻炼开发者对Java和Android...

    MessagePack编解码jar包

    总的来说,MessagePack编解码jar包为Java开发者提供了一个高效、轻量级的序列化工具,尤其适合在Netty等高性能网络框架中使用,以实现快速、低延迟的数据交换。通过`javassist`库的配合,还能实现更灵活的代码生成和...

    Google开源项目ZXing(二维条码编解码)简单使用(Java版)

    在本文中,我们将探讨如何在Java环境中使用ZXing进行二维码的编解码操作。 首先,我们需要了解ZXing的基本功能。ZXing库支持以下主要功能: 1. **读取功能**:ZXing可以读取各种类型的条形码和二维码,包括但不...

    RLE编码与解码算法及过程

    它的基本原理是将连续出现的相同字符用一个字符和它连续出现的次数来表示,以此达到减小数据量的目的。例如,字符串 "AAAAABBBCCD" 可以被压缩为 "5A3B2C1D"。 编码过程如下: 1. 遍历输入数据:从第一个字符开始,...

    lettuce-core,高级Java Read客户端用于线程安全同步、异步和无功使用。支持群集、哨兵、管道和编解码器。.zip

    它不仅支持基本的Redis命令,还对Redis的集群、哨兵(Sentinel)系统、管道(Pipeline)和自定义编解码器(Codec)有全面的支持,使得在Java环境中与Redis交互变得更加简单和高效。 二、线程安全与同步/异步API ...

    QR Code 二维条码 编控件 解码控件

    本编解码控件专为开发人员设计,用于在应用程序中生成和读取QR码,从而简化集成过程。 一、QR码的基本原理 1. 结构:QR码由黑白相间的模块组成,分为数据区域、定位图案、校正图案、定时图案和静区等部分。其中,...

    java源码包---java 源码 大量 实例

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性...

    collectionJava源码-java-code-gen:基于Java注释处理器的Java源代码生成器集合

    集合Java源码#java-code-gen基于的Java源代码生成器集合 #子项目 ...bson-gen对生成的Bean编解码器的运行时依赖性,包括针对基本类型(如short,byte ...数组,枚举和通用列表类型)的额外编解码器。

    java编的qq代码

    总的来说,"java编的qq代码"是一个很好的学习资源,可以让初学者了解到Java在网络编程中的应用,理解基本的面向对象设计,以及意识到在实际项目中多线程的重要性。通过分析和改进这个项目,你可以逐步提高你的编程...

    mediacodecquery:媒体编解码器查询 Android 应用

    例如,要查找支持特定MIME类型的编解码器,我们可以遍历`MediaCodecInfo`数组,对每个编解码器检查其是否支持指定的MIME类型。这通常通过调用`isEncoder()`和`getSupportedTypes()`方法来实现。`isEncoder()`用于...

    java源码包3

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java源码包2

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java版 qq 支持视频

    视频聊天功能涉及音视频编解码技术,这通常需要第三方库,如FFmpeg。Java可以通过JNI(Java Native Interface)调用C/C++编写的库来处理音视频数据。此外,Java的`javax.media`包也提供了一些基本的多媒体处理能力...

    Java面试题目总结(137页).docx

    * Netty 的编解码和传输机制 * Netty 的应用场景和优缺点 缓存 缓存是软件系统中的一种优化技术,用于提高系统的性能和响应速度。缓存知识点包括: * 缓存的基本概念和类型 * 缓存的实现和优化 * 缓存的应用场景...

    基于kotlin+tornadoFx的跨平台密码学工具箱.包含编解码,编码转换,加解密, 哈希,MAC,签名,大数运算,压缩,二

    这个工具箱提供了丰富的功能,包括编解码、编码转换、加解密、哈希计算、消息认证代码(MAC)、数字签名、大数运算、数据压缩以及二维码生成,同时也支持插件扩展,非常适合CTF(Capture The Flag)网络安全竞赛和...

Global site tag (gtag.js) - Google Analytics