精华内容
下载资源
问答
  • 背景 :  项目程序中用到需要socket 传输指令到C++程序中,需要TCP 的连接方式。 所以就想到用socket 来连接 。 问题: c++ 接收字节和字节的大小... 而C++中 可以定义 unsigned char 设置无符号数据类型。  ...

    背景 :

       项目程序中用到需要socket 传输指令到C++程序中,需要TCP 的连接方式。 所以就想到用socket 来连接 。

    问题:

    c++ 接收字节和字节的大小都是有严格要求的, 需要传输规定长度的无符号的指令。那么问题来了, Java程序中byte类型都是有符号的,长度在-128 到127之间。  而C++中 可以定义 unsigned char 设置无符号数据类型。   

    实现方法:

     public static byte[] tolh(int n) {
            byte[] b = new byte[4];
            b[0] = (byte) (n & 0xff);
            b[1] = (byte) (n >> 8 & 0xff);
            b[2] = (byte) (n >> 16 & 0xff);
            b[3] = (byte) (n >> 24 & 0xff);
            return b;
        }

    可以看到 输入 int =0xff   返回 byte[] b={-1,0,0,0}

    但是这只能解决传输int 类型的数据, 那么像String 类型的数据 怎么转换的 。

    char[]  chr=String.toCharArray();   // String 先转char 类型
    
    
     /**
         * char[]  转byte[]
         *
         * @param chars
         * @return
         */
        public static byte[] getBytes(char[] chars) {
            Charset cs = Charset.forName("ISO8859-1");    //  编码类型用ISO8859-1 
            CharBuffer cb = CharBuffer.allocate(chars.length);
            cb.put(chars);
            cb.flip();
            ByteBuffer bb = cs.encode(cb);
            return bb.array();
        }
    
    

    OK,这样String 类型数据也就可以传输了 。 

    展开全文
  • javabyte数组的不同写法

    万次阅读 2014-11-20 00:11:39
    经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),“byte数组”里面全部是“byte”,即每一个byte都可以用二进制、十六进制、十进制来表示。 首先八位二进制数0000 0000 ~...

    经常看到java中对byte数组的不同定义,粗略整理的一下:
    一个字节(byte)=8位(bit),“byte数组”里面全部是“byte”,即每一个byte都可以用二进制、十六进制、十进制来表示。

     

    首先八位二进制数0000 0000 ~1111 1111,一共可以表示2^8=256位数,
    如果想要表示无符号整数,可以表示0~255。
    如果想要表示有符号整数,将
    左边第一位作为符号位,即0代表正数,1代表负数,后面7位数值域可以表示0~127,这就是原码定义。

    我们先来看看8位二进制:00010110,

    • 当把它看作无符号数时,计算方法如下:
      二进制:00010110 ------> 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 22
    • 当把它看作有符号数时,左边第一位0表示正数,只计算后面7位,计算方法如下:
      二进制:00010110 ------> 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 22

    Java没有无符号类型,全部是有符号类型的数据类型。但是其它语言,如C语言的unsigned short 无符号数,它值的范围就是要从0开始,并且比java的short类型保存的数据范围更大。
    因为java只有有符号的数据类型,如short 的表示范围 -128到+127,这就是代表有符号的数据类型了。

    在实际开发中,可能要与C写的硬件接口,网络接口相互直接数据交互,此时由于java没有无符号的数据类型,导致java与C看似相同的数据类型,其实存储空间确是不同的,这个问题解决方法是java用更高的存储数据类型,如果C用int,你的java就要考虑用Long或者BigInteger了。还有一种方法就是用java的guava框架来实现你的目标了。

     

    在Java工程代码中

    二进制:00010110 ------> 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 22
    16进制:  0x16 ----------> 1*16^1 + 6*16^0  = 22
    十进制:22

    所以下面三者等价:

    byte [] aa = {00010110,  01010010,  10111000};
    byte [] aa = {0x16,      0x52,      0xB8};
    byte [] aa = {22,        82,        184};

    • 在Eclipse断点调试的时候,看到的byte数组内容都是用十进制表示
    • 有时会看到负数,是因为:java读取的方式只支持字节数组,一个byte = 8位,所以一个byte容量不能超过127,如果超过就会溢出,以负数的形式显示。
    • 溢出原因如下:java采用补码存储整数,int型为32位二进制,byte为8位二进制 

    那么130在内存中的表示形式:00000000 00000000 00000000 10000010  
    这样截取后8位就变成10000010,补码表示的时候第一位是符号位,0正1负,所以可以知道10000010肯定是一个负数,
    再来看它的数值部分,补码由正数变负数,还是正数变负,方法:“按位取反,再加1”,所以后7位:0000010应该变为1111101 + 1 = 1111110(即126)  

    又因为是负数,所以就截取变成-126了

     

    我们再来看下-130的例子(符号位是1,其余按位取反+1)  
    -130在内存中的表示形式:11111111 11111111 11111111 01111110  
    这样截取后8位就变成01111110,显然这是整数啊,然后数值部分是126  
    64+32+16+8+4+2=126 

     

     

    展开全文
  • 1.c++的byte(尤其Vc和c#)为无符号类型,范围从0-255,例如,byte bt =-5,实际bt =251 ;Javabyte为有符号的,范围从-127-127。 2.c++的char类型为1个字节,而java的为两个字节,vc的char是有符号的。 3.加载动态...

    最近,开发一些微服务,用c++和java联合开发。现在总结和记录以下工作学习中的心得:

    1.c++的byte(尤其Vc和c#)为无符号类型,范围从0-255,例如,byte bt =-5,实际bt =251 ;Java的byte为有符号的,范围从-127-127。

    2.c++的char类型为1个字节,而java的为两个字节,vc的char是有符号的。

    3.加载动态库,vc的需要为文件全名,而QT和Java为了兼容Windows和Linux,一般只需要输入文件名,不需要扩展名即可。

    4.long类型,在32位系统中是32位,在64位系统中是64位,一般建议用long long 或者_int64.

    5.c++传递过来参数Int*和int&用IntByReference来代替(不建议用Int[]),char**用过PointerByReference来代替( 不建议用String[]代替),因为后面如果涉及内存释放,则传递回PointerByReference.GetValue() 即可。将char**转换为String的方法如下:ppCurveHeaderSet.getValue().getString(0,"UTF-8");

    6.C++字符串比较相等可以==,Java需要用String.equal来处理。

    7、c++输出到网页的字符串需要编码到UTF8模式,否则中文乱码。如果输出到URI则需要编码为escape编码。

    char dec2hexChar(short int n) {
     if ( 0 <= n && n <= 9 ) {
      return char( short('0') + n );
     } else if ( 10 <= n && n <= 15 ) {
      return char( short('A') + n - 10 );
     } else {
      return char(0);
     }
    }
    
    short int hexChar2dec(char c) {
     if ( '0'<=c && c<='9' ) {
      return short(c-'0');
     } else if ( 'a'<=c && c<='f' ) {
      return ( short(c-'a') + 10 );
     } else if ( 'A'<=c && c<='F' ) {
      return ( short(c-'A') + 10 );
     } else {
      return -1;
     }
    }
    
    
    
    
    
    string escapeURL(const string &URL)
    {
     string result = "";
     for ( unsigned int i=0; i<URL.size(); i++ ) {
      char c = URL[i];
      if (
       ( '0'<=c && c<='9' ) ||
       ( 'a'<=c && c<='z' ) ||
       ( 'A'<=c && c<='Z' ) ||
       c=='/' || c=='.'
       ) {
       result += c;
      } else {
       int j = (short int)c;
       if ( j < 0 ) {
        j += 256;
       }
       int i1, i0;
       i1 = j / 16;
       i0 = j - i1*16;
       result += '%';
       result += dec2hexChar(i1);
       result += dec2hexChar(i0);
      }
     }
     return result;
    }
    
    
    例子:
    
    
    
    
    wstring test = L"南";
    string test1 = escape(utility::conversions::to_utf8string(test));
    

     

    展开全文
  • byte数组的转化

    千次阅读 2017-10-26 11:11:57
    java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),“byte数组”里面全部是“byte”,即每一个byte都可以用二进制、十六进制、十进制来表示。 首先八位二进制数0000 0000 ~...

    java中对byte数组的不同定义,粗略整理的一下:

    一个字节(byte)=8位(bit),“byte数组”里面全部是“byte”,即每一个byte都可以用二进制、十六进制、十进制来表示。


    首先八位二进制数0000 0000 ~1111 1111,一共可以表示2^8=256位数,

    如果想要表示无符号整数,可以表示0~255。

    如果想要表示有符号整数,就要将最前面一个二进制位作为符号位,即0代表正数,1代表负数,后面7位数值域可以表示0~127,这就是原码定义。


    我们先来看看8位二进制:00010110,当把它看作无符号数时,计算方法如下:

    二进制:00010110 ------> 0*2^8 + 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 22

    当把它看作有符号数时,左边第一位0表示正数,只计算后面7位,计算方法如下:

    二进制:00010110 ------>               0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 22



    Java没有无符号类型,全部是有符号类型的数据类型。但是其它语言,如C语言的unsigned short 无符号数,它值的范围就是要从0开始,并且比java的short类型保存的数据范围更大。

    因为java只有有符号的数据类型,如short 的表示范围 -128到+127,这就是代表有符号的数据类型了。


    在实际开发中,可能要与C写的硬件接口,网络接口相互直接数据交互,此时由于java没有无符号的数据类型,导致java与C看似相同的数据类型,其实存储空间确是不同的,这个问题解决方法是java用更高的存储数据类型,如果C用int,你的java就要考虑用Long或者BigInteger了。还有一种方法就是用java的guava框架来实现你的目标了。


    在Java工程代码中

    二进制:00010110 ------> 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 22
    16进制:  0x16 ----------> 1*16^1 + 6*16^0  = 22

    十进制:22


    所以下面三者等价:

    byte [] aa = {00010110,  01010010,  10111000};
    byte [] aa = {0x16,      0x52,      0xB8};

    byte [] aa = {22,        82,        184};


    1、在Eclipse断点调试的时候,看到的byte数组内容都是用十进制表示。有时会看到负数,是因为:

    2、java读取的方式只支持字节数组,一个byte = 8位,所以一个byte容量不能超过127,如果超过就会溢出,以负数的形式显示。

    3、溢出原因如下:

    java采用补码存储整数,int型为32位二进制,byte为8位二进制 

    那么130在内存中的表示形式:00000000 00000000 00000000 10000010  

    这样截取后8位就变成10000010,补码表示的时候第一位是符号位,0正1负,所以可以知道10000010肯定是一个负数,

    再来看它的数值部分,补码由正数变负数,还是正数变负,方法:“按位取反,再加1”,所以后7位:0000010应该变为1111101 + 1 = 1111110(即126)  

    又因为是负数,所以就截取变成-126了



    我们再来看下-130的例子(符号位是1,其余按位取反+1)  

    -130在内存中的表示形式:11111111 11111111 11111111 01111110  

    这样截取后8位就变成01111110,显然这是整数啊,然后数值部分是126  

    64+32+16+8+4+2=126 



    展开全文
  • java-集合

    2020-02-11 23:19:58
    注:1.java不支持无符号类型unsigned,C/C++支持。 2.java基本数据类型 byte,short(2bytes),int(4),long(8),float(4),double(8),char(2),boolean(1) 3.强制类型转换 (int)11.2 //将11.2强制转换为int型 4....
  • Java定义了4种整数类型:byte、short、int和long。所有这些类型都是有符号的、正或负的整数。Java不支持无符号的、只是正值的整数。许多其它计算机语言同时支持有符号和无符号整数。然而,Java的设计者觉得无符号...
  • JAVA位运算

    2017-06-26 10:58:45
    Java定义的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long(64位)、int(32位)、short(16位)、char(16位无符号)、byte(8位),其中 1字节等于8位,即1 byte = 8 bit。...
  • Java:变量与运算符

    2019-10-11 16:49:45
    Java中没有无符号类型的变量; 在Java中变量有八种内置的数据类型 类型名 字节数 默认值 对应包装类 byte 1 0 Byte char 2 .\v0000 Charter short 2 0 Short int 4 0 Integer long 8 0 Long ...
  • [size=small][color=blue]1.Java中的数值类型不存在无符号的,他们的取值范围是固定的,不会随着硬件或系统环境的变化而改变。 2.对于数值类型的基本类型的取值范围,我们无需强行去记忆,因为它们的值都已经以...
  • java中的位运算符

    2016-09-11 11:11:45
    java中的位运算符java中的位运算符 ...衍生运算符概述Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型分类左移( )、右移( >> ) 、无符号右移( >>> ) 、
  •  所以如果传感器、开发板那边定义的是无符号int型之类数据,Java端收到的数据用bytes传输的话,要将byte转换为正确的int等数值类型,就得判断byte值的正负,value=X>0?X:256+X,或者用下面这个方法;  public ...
  • 浅谈Java的类加载过程

    2021-02-27 13:16:28
    .class(Byte code)是图灵完备的,从而使其他语言也有在java虚拟机上运行。 Class文件结构:类似于C语言结构体的伪结构:只有两种数据类型: 无符号数和表 无符号数(基本数据类型):u1,u2,u4,u8 分别代表1个字节,2个...
  • 因为Java 使用2的补码来存储负数,并且因为Java 中的所有整数都是有符号的,这样应用位运算符可以容易地达到意想不到的结果。例如,不管你如何打算,Java 用高位来代表负数。为避免这个讨厌的意外,请记住不管高位的...
  • NDK java和c参数传递

    千次阅读 2013-12-25 14:52:51
    jni实现java和c互通,jni定义了一些数据类型,进行java与C参数传递。 数据类型对应关系如下表: Java 类型 本地 C 类型 实际表示的 C 类型 (Win32) ...无符号,8 位 byte jbyte signe
  • java中int数据存储格式

    千次阅读 2015-01-04 16:33:43
    byte,short,int在Java中的存储方式: 因为byte,short都可以用int来表示,所以我...语言给我们更多的选择,那就是我们可以显示的定义无符号的整形(如unsigned int a), 它就可以表示更大的整数,它的范围为:0-232
  • NO.3 JNI调用java成员

    2020-04-08 17:45:03
    零蚀 基本数据类型&引用 这些定义可以在<jni.h>中找到对应的部分。 Java类型 本地类型 描述 ...byte ...C/C++无符号的16位整型 short jshort C/C++带符号的16位整型 int jint C/...
  • Java与C#语法比较

    2012-04-04 18:05:28
    基本数据类型  ...C#的数据类型会多一些,Java中的数据类型都是有符号的,而C#中还定义了相应的无符号数据类型:bool,(byte,sbyte),char,(short, ushort) ,( int, uint) , (long, ulong),float,double
  • Java与C#语法异同

    2010-09-18 15:14:44
    [align=center]Java与C#语法异同[/align] [b]一.值类型[/b] ...C#的数据类型会多一些,java中的数据类型都是有符号的,而C#中还定义了相应的无符号数据类型:bool,(byte,sbyte),char,(short, u...
  • Java基本类型学习笔记

    2009-09-15 23:16:00
    1.Java中的数值类型不存在无符号的,他们的取值范围是固定的,不会随着硬件或系统环境的变化而改变。2.对于数值类型的基本类型的取值范围,我们无需强行去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中...
  • JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。 对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的...
  • Java中的基本类型

    2012-03-10 15:20:22
    2 JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的...
  • Java基本类型学习笔记

    2010-11-08 10:12:00
    1.Java中的数值类型不存在无符号的,他们的取值范围是固定的,不会随着硬件或系统环境的变化而改变。 2.对于数值类型的基本类型的取值范围,我们无需强行去记忆,因为它们的值都已经以常量的形式定义在...
  • PAGE PAGE 1 [模拟] 计算机二级java机试8 一基本操作题 第1题 下列程序中定义了3个变量1sb类型分别为longshort,byte并赋了初始值分别为-11-1要求对1做按位左移运算对s做按位右移运算对b做无符号按位右移运算移动的...
  • 数据类型:【1】基础数据类型:A数值型(a整数类型:8位byte、16位short型、...注意:Java中数值类型不存在无符号数,这一点跟C++不一样。也因此Java中数据的数值范围固定,不会随着机器硬件或者操作系统的改变而改...
  • Java学习第二节第1章

    2020-07-18 10:51:40
    掌握返回值参数方法的定义格式 了解方法定义的注意事项 第一章 数据类型转换 Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。 1.1 自动转换 一个 int 类型...
  • Java_语法基础_移位运算的真实剖析

    千次阅读 2015-03-24 14:33:00
    Java定义了3种移位运算符,分别是左移运算符“”、右移运算符“>>”和无符号右移运算符“>>>”,对于移位运算,移位运算两边的操作数要求为整型,即byte、short、char、int或long类型,或者通过拆箱转换后为整型。...
  • 抛砖引玉: Java定义了 3 种移位运算符,分别是左移运算符“”、右移运算符“>>”和无符号右移运算符“>>>”,对于移位运算,移位运算两边的操作数要求为整型,即 byte、short、char、 int 和 long类型,或者...
  • 赋值运算符 =把右边的值赋值给左边 ...=(无符号右移) //定义变量 int a=3; int b=4; a+=b; System.out.println(a); byte c=2; // c=c+3; b+3为int类型 c+=3; //支持定义形式 int a=1,b=2,c=3; i
  • java基础入门教程

    热门讨论 2009-04-29 21:36:10
    微 软 总 裁 比 尔 ·盖 茨 在 悄 悄 地 观 察了 一 段 时 间 后 ,不 感 慨 地 说 :"Java是 长 时 间 以 来 最 卓 越 的 程序 设 计 语 言 ",并确 定 微软 整 个 软 件 开 发 的 战 略 从 PC 单 机 时 代 向 着 以...

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

java定义无符号byte

java 订阅