精华内容
下载资源
问答
  • 最近写通信协议相关项目, 自己封装了一套数据转换, 主要用于各种数据跟byte[]数组转换, 可以直接哪去使用 /** * @dec: byte 数据转换类 * @author: 鸠摩智 * @date: 2020/6/15 */ public final class ...
    • 最近写通信协议相关的项目, 自己封装了一套数据转换, 主要用于数字类型跟byte[]数组的转换, 可以直接拿去使用
    
    /**
     * @dec: byte 数据转换类
     * @author: 鸠摩智
     * @date: 2020/6/15
     */
    public final class ByteUtils {
    
    	private ByteUtils() {}
    
    	/**
    	 * long值转化为byte数组
    	 *
    	 * @param value 数值
    	 * @param isBig 是否大端模式
    	 * @return
    	 */
    	public static byte[] longToByteArr(long value, boolean isBig) {
    		return NumberToByteArr(value, isBig, 8);
    	}
    
    
    	/**
    	 * int值转化为byte数组
    	 *
    	 * @param value 数值
    	 * @param isBig 是否大端模式
    	 * @return
    	 */
    	public static byte[] intToByteArr(int value, boolean isBig) {
    		return NumberToByteArr(value, isBig, 4);
    	}
    
    
    	/**
    	 * short值转化为byte数组
    	 *
    	 * @param value 数值
    	 * @param isBig 是否大端模式
    	 * @return
    	 */
    	public static byte[] shortToByteArr(short value, boolean isBig) {
    		return NumberToByteArr(value, isBig, 2);
    	}
    
    
    	/**
    	 * byte[] 数组转为 int数值
    	 *
    	 * @param arr   数组
    	 * @param isBig 是否大端模式
    	 * @return
    	 */
    	public static Integer byteArrToInt(byte[] arr, boolean isBig) {
    		return byteArrToNumber(arr, isBig, 4).intValue();
    	}
    
    
    	/**
    	 * byte[] 数组转为 short数值
    	 *
    	 * @param arr   数组
    	 * @param isBig 是否大端模式
    	 * @return
    	 */
    	public static Integer byteArrToShort(byte[] arr, boolean isBig) {
    		return byteArrToNumber(arr, isBig, 2).intValue();
    	}
    
    	/**
    	 * byte[] 数组转为 long数值
    	 *
    	 * @param arr   数组
    	 * @param isBig 是否大端模式
    	 * @return
    	 */
    	public static Long byteArrToLong(byte[] arr, boolean isBig) {
    		return byteArrToNumber(arr, isBig, 8).longValue();
    	}
    
    
    
    	/**
    	 * byte 转为一个数值
    	 *
    	 * @param arr
    	 * @param isBig 是否
    	 * @param trim 长度 long=8, int=4, short=2   
    	 * @return 
    	 */
    	private static Number byteArrToNumber(byte[] arr, boolean isBig, int trim) {
    
    		if (arr == null || arr.length == 0) {
    			return null;
    		}
    
    		// 舍弃掉数组长度超过8的部分
    		if (arr.length > trim) {
    
    			for (int i = trim; i < arr.length; i++) {
    				arr[i] = 0;
    			}
    		}
    		long total = 0;
    		for (int i = 0; i < arr.length; i++) {
    
    			long arrVal = arr[i] & 0xFF;
    			arrVal = isBig ? arrVal << ((arr.length - i - 1) * 8) : arrVal << ((i) * 8);
    			total |= arrVal;
    		}
    
    
    		return total;
    	}
    
    
    	/**
    	 * 一个数值转为byte数组
    	 *
    	 * @param number 数值
    	 * @param isBig  是否大端模式
    	 * @param trim   长度 long=8, int=4, short=2
    	 * @return
    	 */
    	private static byte[] NumberToByteArr(Number number, boolean isBig, int trim) {
    
    
    		if (number == null) {
    			return null;
    		}
    
    		if (trim <= 0) {
    			return null;
    		}
    		long value = number.longValue();
    
    		byte[] arr = new byte[trim];
    
    		for (int i = 0; i < trim; i++) {
    
    			long val = value >> (i * 8);
    			val &= 0xff;
    			if (isBig) {
    				arr[trim - i - 1] = (byte) val;
    			} else {
    				arr[i] = (byte) val;
    			}
    
    		}
    
    		return arr;
    	}
    
    
    }
    
    
    
    
    展开全文
  • //bytep[]转换为String,支持传递编码1、“字符”是由数字来表示先来重新了解一下计算机是如何处理“字符”,这个原理是大家必须记住,特别是在用Java写程序时候,万万不可模糊。我们知道,...

    String s = "easonjim";//String变量

    byte b[] = s.getBytes();//String转换为byte[]

    String t = new String(b);//bytep[]转换为String,支持传递编码

    1、“字符”是由数字来表示的

    先来重新了解一下计算机是如何处理“字符”的,这个原理是大家必须记住的,特别是在用Java写程序的时候,万万不可模糊。我们知道,计算机把任何东西都用数字来表示,“字符”也不例外。比如我们要显示一个阿拉伯数字“3”,在我们的PC里,其实并不是仅仅用一个数字3来代表我们要写的“3”,而是以十六进制的0x33来代表,包括放在内存或者是写到文件里,其实都是写着0x33的,不信你可以编辑一个文本文件,写一个“3”,然后用ultraEdit看他的原始码。

    2、一切“字符”都必定用数字+编码表表示

    这时候,有一个问题:为什么一定要用0x33来代表“3”呢?而不用0x43来代表呢?或者是直接用0x03来代替?其实用什么来代表都可以,只不过大家都习惯了用ASCII编码表(是美国国家信息交换表)来确定各字符应该是用什么数字代表的。同样,为了表示中国字,我国也指定了中文的编码表,其中最广泛使用的是GB2312。比如中文的“当”字,就是用0xB5, 0xB1这两个八位的数字来表示的。所以如果显示字符的程序不知道一列数字到底是按什么编码表编码的,他也无法去判断到底这些是什么文字。如果随便用一个不对的编码表来处理这些数字,处理出来的字符很可能完全是错的。比如在英文系统上,没有GB2312编码表,送给他一个0xB5,0xB1,他就傻傻的当作ASCII来处理(操作系统通常都有自己默认的编码表),结果显示出来就是两个奇怪的符号,因为这两个字在ASCII表里就是那两个符号。同样在繁体中文系统里,他的编码表是BIG5,显示出来也是一个奇怪的中文,不是“当”字。

    3、Unicode让全世界都说一种语言

    看完上面的文字,是否觉得,世界有那么多语言,每个都有自己的一套编码表,很麻烦呢?就算是中文,也有两套流行的编码表,一个是GB2312,一个是BIG5。要使用不同中文的编码的字符时,还要转来转去,的确很麻烦。不光这个,如果想要写一篇包含很多过国文字的文章,就麻烦了,必须要让处理这个文章的程序知道,哪个字是什么编码标准的。如果你想要在文章里找一个字,也必须指定你要找的是哪种编码的哪个字。否则,你要找一个0xB5,0xB1的中文“当”字,很可能把同样数字表示的日文、波兰文这些不相干的字一起给你找出来,够麻烦的吧!

    所以人们想,不如大家都用同一个编码标准吧,各种文字都在编码表里有一席之地,处理文字的程序只需要都按这个编码表来处理就可以了。不过要一个编码表里包含所有的文字,这张表就大了,本来英文字+数字一共只有128个以内。但加上中文后,忽然就多了数万个,所以存放一个字符需要的大小也大了很多。现在Unicode规定了一个字符必须由2个8位数字来表示,想想,8x8x8x8x = 65536 ,是多大的一个数字啊!所以全世界的文字才能都包含进去。当然拉,也有人说中国字可能都不止6万个拉,还要包括别的文字,但人家外国人觉得你们中国人常用的也没那么多,所以就这么定了,我们也没办法。需要注意的是GB2312和Unicode虽然都是用两个8位数来代表一个中文字,但具体的规格可不一样,比如0xB5,0xB1在Unicode里面可不是“当”字,而是另外一国的文字来的。

    4、C是如何简洁的处理字符的

    我们来谈谈C的字符串。C语言诞生在Java之前,C语言的基本数据类型是没有字符串这个类型的,它只有char[]。也就是C把字符顺序放入一个字节数组就完了。而且C也不管放在数组里的是什么文字,也不管那些字是按什么编码标准的。而且他的char的大小也不一定是8位数字,有时候是16位也可能,这要看具体的机器和操作系统。所以写程序的人必须要知道正在处理的char[]的内容到底是按什么编码表表示的字符串,要知道如果比较两国文字是否相同,可是没任何意义的哦!

    5、Java是是如何处理字符的

    世界总会进步的,Java就是一个例子。Java终于有了String类了,它是解决字符问题的最好工具。在Java里,一个基本的要点是:String类对象是不需要指定编码表的!为什么它会自己知道一堆数字各代表什么字符呢?就是因为String里的字符信息是用Unicode编码存放的。而Java为了表示字符(注意是单个字符),也有char这个数据类型,而且他的大小是固定2个8位16进制数字长度,也就是0~65535罗。为的就是对应Unicode里面的一个字符。大家如果想取一个String里的按Unicode数字,可以用getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 方法取得一个char[],这个char[]里就是表示String字符的,按Unicode编码表编码的数字。

    可惜现在绝大多数的系统和程序都不是按Unicode来处理字符,而Java程序总是要和别的程序和系统交换数据的,所以在接收一个字符,或者是发送一个字符的时候,就必须要留意当前系统和Unicode的关系了。比如你从网络或者文件接受到一数字:0xB5,0xB1,Java程序并不知道这两个字到底是中文呢?还是日文,或者英文。你如果不指明这个两个数字的编码表,Java就会按当前系统默认的编码表来处理。如果这两个数字是从中文WIN98发出去的,Java程序又是在英文LINUX上运行的,那就出现了所谓的乱码问题了。也就是Java按英文的编码表ASCII来处理这两个数字,当通过new String({0xB5,0xB1})得到的String的时候,这个String代表的已经不是中文的“当”字,而是两个英文的奇怪字符了。不过如果你知道这两个数字一定是中文的话,就可以指定用new String({0xB5,0xB1},"GB2312")来处理,这时候新建立的String才真的是一个“当”字。当然拉,如果你要把一个“当”字的Java的String显示在中文WIN98上,必须把这个字输出成两个8位数字:0xB5,0xB1,不管是写成文件还是输出到浏览器上,都必须是0xB5,0xB1。如何把“当”字用GB2312输出?String.getBytes("GB2312")就可以拉!所以有一点要记住:和外界交换任何信息都是以byte[]来进行的!。你可以留意一下Java大多数的I/O类,都有以byte[]作为参数和返回值的方法。不过,也有很多写的比较糊涂的程序,没有提供byte[]交换信息的方法,害的不同文字平台的程序员很头疼。Servlet的HttpRequest.getParameter()就是这样。好在有的JSP/SERVLET容易还提供先指定编码表的方法,才能比较简单的解决这个问题。

    6、网上关于Java中文问题的一些错误处理方法

    一个是最常见的,不管什么内容,都用new String(...,"ISO-8859-1")来建立字符串,然后使用的时候按默认的编码格式(通常在服务器上都是英文系统)输出字符串。这样其实你使用的String并不是按Unicode来代表真正的字符,而是强行把byte数组复制到String的char[]里,一旦你的运行环境改变,你就被迫要修改一大堆的代码。而且也无法在同一个字符串里处理几种不同编码的文字。

    另一个是把一种编码格式的字符串,比如是GB2312,转换成另一种格式的字符串,比如UTF-8,然后不指明是UTF-8编码,而直接用new String(...)来建立String,这样放在String里面的字符也是无法确定的,它在不同的系统上代表不同的字符。如果要求别人用“UTF-8格式”的String来交换信息的时候,其实已经破坏了Java为了兼容各种语言所做的规定。这种错误的本质思想是还按写C语言的方式,把字符串纯粹当作可以自己自由编码的存储器使用,而忽略了Java字符串只有一种编码格式。如果真的想自由编码,用byte[]或者char[]就完全了解决问题的了。

    参考:

    展开全文
  • 一个字节是8位.Java大多数原始类型都是有符号,而byte,short,int和long则以二进制补码编码. (char类型是无符号,符号概念不适用于boolean.)在此数字方案中,最高有效位指定数字的符号.如果需要更多位,则将...

    在Java中,int是32位.一个字节是8位.

    Java中的大多数原始类型都是有符号的,而byte,short,int和long则以二进制补码编码. (char类型是无符号的,符号的概念不适用于boolean.)

    在此数字方案中,最高有效位指定数字的符号.如果需要更多位,则将最高有效位(“MSB”)简单地复制到新MSB.

    所以如果你有字节255:11111111

    并且您希望将其表示为int(32位),您只需将1复制到左侧24次.

    现在,读取负二进制补码的一种方法是从最低有效位开始,向左移动直到找到第一个1,然后反转每一位.结果数字是该数字的正数

    例如:11111111转到00000001 = -1.这就是Java将显示为值的内容.

    您可能想要做的是知道字节的无符号值.

    您可以使用位掩码来完成此操作,该位掩码删除除最低8位之外的所有内容. (0xff的)

    所以:

    byte signedByte = -1;

    int unsignedByte = signedByte & (0xff);

    System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);

    打印出来:“签名:-1无符号:255”

    这里到底发生了什么?

    我们使用按位AND来屏蔽所有无关的符号位(最低有效8位左边的1).

    当int转换为字节时,Java会从最左边的24位中删除

    1111111111111111111111111010101

    &

    0000000000000000000000001111111

    =

    0000000000000000000000001010101

    由于第32位现在是符号位而不是第8位(我们将符号位设置为0,这是正数),因此字节的原始8位由Java读取为正值.

    展开全文
  • 最原始类型Java签名,byte,short,int,和long被编码在二进制补码。(char类型是无符号,符号概念不适用boolean。)在此数字方案中,最高有效位指定数字的符号。如果需要更多位,则将最高有效位(“MSB”)...

    在Java中,a int是32位。A byte是8 bits。

    最原始的类型Java中的签名,byte,short,int,和long被编码在二进制补码。(char类型是无符号的,符号的概念不适用boolean。)

    在此数字方案中,最高有效位指定数字的符号。如果需要更多位,则将最高有效位(“MSB”)简单地复制到新MSB。

    因此,如果您有字节255:11111111 并且您希望将其表示为int(32位),则只需将1复制到左侧24次。

    现在,读取负二进制补码的一种方法是从最低有效位开始,向左移动直到找到第一个1,然后反转每一位。结果数字是该数字的正数

    例如:11111111转到00000001= -1。这就是Java将显示为值的内容。

    您可能想要做的是知道字节的无符号值。

    您可以使用位掩码来完成此操作,该位掩码删除除最低8位之外的所有内容。(0xff的)

    所以:

    byte signedByte = -1;

    int unsignedByte = signedByte & (0xff);

    System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);

    打印出来: "Signed: -1 Unsigned: 255"

    这里到底发生了什么?

    我们使用按位AND来屏蔽所有无关的符号位(最低有效8位左边的1)。当int转换为字节时,Java会截断最左边的24位

    1111111111111111111111111010101

    &

    0000000000000000000000001111111

    =

    0000000000000000000000001010101

    由于第32位现在是符号位而不是第8位(我们将符号位设置为0,这是正数),因此字节的原始8位由Java读取为正值。

    展开全文
  • 最原始类型Java签名,byte,short,int,和long被编码在二进制补码。(char类型是无符号,符号概念不适用boolean。)在此数字方案中,最高有效位指定数字的符号。如果需要更多位,则将最高有效位(“MSB”)...
  • 1. “字符”是由数字来表示先来重新了解一下计算机是如何处理“字符”,这个原理是大家必须记住,特别是在用JAVA写程序时候,万万不可模糊。我们知道,计算机把任何东西都用数字来表示,“字符”也不例外。...
  • byte(C# 参考)byte 关键字代表一种整型,该类型按下表所示...java byte是做为最小的数字来处理的,因此它的值域被定义为-128~127,介绍byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进...
  • byte(C# 参考)byte 关键字代表一种整型,该类型按下表所示...java byte是做为最小的数字来处理的,因此它的值域被定义为-128~127,介绍byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进...
  • * 对数字和字节进行转换。 * 基础知识: * 假设数据存储是以大端模式存储: * byte: 字节类型 占8位二进制 00000000 * char: 字符类型 占2个字节 16位二进制 byte[0] byte[1] * int : 整数类型 占4个字节 32...
  • 1. “字符”是由数字来表示先来重新了解一下计算机是如何处理“字符”,这个原理是大家必须记住,特别是在用JAVA写程序时候,万万不可模糊。我们知道,计算机把任何东西都用数字来表示,“字符”也不例外。...
  • 在此数字中,最高有效位指定数字的符号。如果需要更多位,则最高有效位(“MSB”)被简单地复制到新MSB。所以如果你有字节255:11111111并且你想把它表示为一个int(32位),你只需将1复制到左边24次。现在,读取负二...
  • 这里简单记录下两种转换方式:第一种:1、int与byte[]之间转换(类似的byte short,long型)[java] view plain copy/*** 将int数值转换为占四个字节的byte数组,本方法适用于(低位在前,高位在后)顺序。 和bytesTo...
  • //近期在和C语言socket做交互时 由于java端需要给服务端传C结构体 所以所有数据需要byte数组传输 下一篇会写如何把数据拼接成byte数组 接受到也是byte数组 而发来则是超出byte大小范围字节 这时...
  • 标识符和注释标识符:自定义用于标识变量名、函数名、类名、接口名等字符串标识符规则:非数字开头字母、$、下划线、数字组成;区分大小写;不能用关键字、保留字关键字:在java语言里有特殊含义单词,都是...
  • C语言里通常可能开发人员直接定义struct 作为数据包,因此在java客户端接收struct 中数据时候,受整数等类型高低位存放影响,需要进行相应转换,参考:转换代码如下:package com.lizongbo.util;/**** Title: 数字...
  • JDK(JAVA_HOME,PATH),Eclipse(workspace) 数据类型(基本类型,引用类型) 基本类型(byte、short、int、long、float、double、char、boolean)2、八种基本类型(续) 2.1)char 表示字符或字符整数数字编码...
  • java位运算符不外乎三种:《左移,》(带符号右移)和>>>(无符号右移)1.左移运算符1)《使指定值所有位都左移规定次数。value<如果移动位数超过了该类型最大位数,呢么编译器会对移动位数取...
  • Java数字类型转换 ()发布时间:2020-08-18 22:30:21来源:ITPUB博客阅读:92作者:amyzJava下数字类型转换 ()[@more@]作者:家居猫各种数字类型转换成字符串型:String s = String.valueOf( value);...
  • String s = "easonjim";//String变量 byte b[] = s.getBytes();//String转换为byte[] String t = new String(b);...先来重新了解一下计算机是如何处理“字符”,这个原理是大家必须记住,特别是在用Java...
  • String s = "easonjim";//String变量 byte b[] = s.getBytes();...先来重新了解一下计算机是如何处理“字符”,这个原理是大家必须记住,特别是在用Java写程序时候,万万不可模...
  • Java中基本类型装箱和拆箱步骤 1 : 封装类所有基本类型,都有对应类类型 比如int对应类是Integer 这种类就叫做封装类package 步骤 2 : Number类数字封装类有 Byte,Short,Integer,Long,Float,Double 这些类...
  • Java数字类型转换 ()[@more@]作者:家居猫各种数字类型转换成字符串型:String s = String.valueOf( value); // 其中 value 为任意一种数字类型。字符串型转换成各种数字类型:String s = "169";byte b = Byte...
  • 本文实例讲述了JAVA中IP和整数相互转化的方法。分享给大家供大家参考。具体分析如下:一、基本知识点IP ——>...)0xFF,得到的数字即为第一段IP。将整数值进行右移位操作(>>>),右移16位,再进行与操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 708
精华内容 283
关键字:

java的数字转byte

java 订阅