利用Java在將整型數(shù)與byte[]數(shù)組進行轉(zhuǎn)換-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關(guān)利用Java在將整型數(shù)與byte[]數(shù)組進行轉(zhuǎn)換,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)公司IDC提供業(yè)務(wù):服務(wù)器托管,成都服務(wù)器租用,服務(wù)器托管,重慶服務(wù)器租用等四川省內(nèi)主機托管與主機租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機房,BGP機房,電信機房,移動機房,聯(lián)通機房。

具體如下:

工作項目需要在java和c/c++之間進行socket通信,socket通信是以字節(jié)流或者字節(jié)包進行的,socket發(fā)送方須將數(shù)據(jù)轉(zhuǎn)換為字節(jié)流或者字節(jié)包,而接收方則將字節(jié)流和字節(jié)包再轉(zhuǎn)換回相應(yīng)的數(shù)據(jù)類型。如果發(fā)送方和接收方都是同種語言,則一般只涉及到字節(jié)序的調(diào)整。而對于java和c/c++的通信,則情況就要復(fù)雜一些,主要是因為java中沒有unsigned類型,并且java和c在某些數(shù)據(jù)類型上的長度不一致。

針對這種情況,本文整理了java數(shù)據(jù)類型和網(wǎng)絡(luò)字節(jié)流或字節(jié)包(相當于java的byte數(shù)組)之間轉(zhuǎn)換方法。實際上網(wǎng)上這方面的資料不少,但往往不全,甚至有些有錯誤,于是就花了點時間對java整型數(shù)和網(wǎng)絡(luò)字節(jié)序的byte[]之間轉(zhuǎn)換的各種情況做了一些驗證和整理。整理出來的函數(shù)如下:

public class ByteConvert {
  // 以下 是整型數(shù) 和 網(wǎng)絡(luò)字節(jié)序的 byte[] 數(shù)組之間的轉(zhuǎn)換
  public static byte[] longToBytes(long n) {
    byte[] b = new byte[8];
    b[7] = (byte) (n & 0xff);
    b[6] = (byte) (n >> 8 & 0xff);
    b[5] = (byte) (n >> 16 & 0xff);
    b[4] = (byte) (n >> 24 & 0xff);
    b[3] = (byte) (n >> 32 & 0xff);
    b[2] = (byte) (n >> 40 & 0xff);
    b[1] = (byte) (n >> 48 & 0xff);
    b[0] = (byte) (n >> 56 & 0xff);
    return b;
  }
  public static void longToBytes( long n, byte[] array, int offset ){
    array[7+offset] = (byte) (n & 0xff);
    array[6+offset] = (byte) (n >> 8 & 0xff);
    array[5+offset] = (byte) (n >> 16 & 0xff);
    array[4+offset] = (byte) (n >> 24 & 0xff);
    array[3+offset] = (byte) (n >> 32 & 0xff);
    array[2+offset] = (byte) (n >> 40 & 0xff);
    array[1+offset] = (byte) (n >> 48 & 0xff);
    array[0+offset] = (byte) (n >> 56 & 0xff);
  }
  public static long bytesToLong( byte[] array )
  {
    return ((((long) array[ 0] & 0xff) << 56)
       | (((long) array[ 1] & 0xff) << 48)
       | (((long) array[ 2] & 0xff) << 40)
       | (((long) array[ 3] & 0xff) << 32)
       | (((long) array[ 4] & 0xff) << 24)
       | (((long) array[ 5] & 0xff) << 16)
       | (((long) array[ 6] & 0xff) << 8)
       | (((long) array[ 7] & 0xff) << 0));
  }
  public static long bytesToLong( byte[] array, int offset )
  {
    return ((((long) array[offset + 0] & 0xff) << 56)
       | (((long) array[offset + 1] & 0xff) << 48)
       | (((long) array[offset + 2] & 0xff) << 40)
       | (((long) array[offset + 3] & 0xff) << 32)
       | (((long) array[offset + 4] & 0xff) << 24)
       | (((long) array[offset + 5] & 0xff) << 16)
       | (((long) array[offset + 6] & 0xff) << 8)
       | (((long) array[offset + 7] & 0xff) << 0));
  }
  public static byte[] intToBytes(int n) {
    byte[] b = new byte[4];
    b[3] = (byte) (n & 0xff);
    b[2] = (byte) (n >> 8 & 0xff);
    b[1] = (byte) (n >> 16 & 0xff);
    b[0] = (byte) (n >> 24 & 0xff);
    return b;
  }
  public static void intToBytes( int n, byte[] array, int offset ){
    array[3+offset] = (byte) (n & 0xff);
    array[2+offset] = (byte) (n >> 8 & 0xff);
    array[1+offset] = (byte) (n >> 16 & 0xff);
    array[offset] = (byte) (n >> 24 & 0xff);
  }
  public static int bytesToInt(byte b[]) {
    return  b[3] & 0xff
        | (b[2] & 0xff) << 8
        | (b[1] & 0xff) << 16
        | (b[0] & 0xff) << 24;
  }
  public static int bytesToInt(byte b[], int offset) {
    return  b[offset+3] & 0xff
        | (b[offset+2] & 0xff) << 8
        | (b[offset+1] & 0xff) << 16
        | (b[offset] & 0xff) << 24;
  }
  public static byte[] uintToBytes( long n )
  {
    byte[] b = new byte[4];
    b[3] = (byte) (n & 0xff);
    b[2] = (byte) (n >> 8 & 0xff);
    b[1] = (byte) (n >> 16 & 0xff);
    b[0] = (byte) (n >> 24 & 0xff);
    return b;
  }
  public static void uintToBytes( long n, byte[] array, int offset ){
    array[3+offset] = (byte) (n );
    array[2+offset] = (byte) (n >> 8 & 0xff);
    array[1+offset] = (byte) (n >> 16 & 0xff);
    array[offset]  = (byte) (n >> 24 & 0xff);
  }
  public static long bytesToUint(byte[] array) {
    return ((long) (array[3] & 0xff))
       | ((long) (array[2] & 0xff)) << 8
       | ((long) (array[1] & 0xff)) << 16
       | ((long) (array[0] & 0xff)) << 24;
  }
  public static long bytesToUint(byte[] array, int offset) {
    return ((long) (array[offset+3] & 0xff))
       | ((long) (array[offset+2] & 0xff)) << 8
       | ((long) (array[offset+1] & 0xff)) << 16
       | ((long) (array[offset]  & 0xff)) << 24;
  }
  public static byte[] shortToBytes(short n) {
    byte[] b = new byte[2];
    b[1] = (byte) ( n    & 0xff);
    b[0] = (byte) ((n >> 8) & 0xff);
    return b;
  }
  public static void shortToBytes(short n, byte[] array, int offset ) {
    array[offset+1] = (byte) ( n    & 0xff);
    array[offset] = (byte) ((n >> 8) & 0xff);
  }
  public static short bytesToShort(byte[] b){
    return (short)( b[1] & 0xff
           |(b[0] & 0xff) << 8 );
  }
  public static short bytesToShort(byte[] b, int offset){
    return (short)( b[offset+1] & 0xff
           |(b[offset]  & 0xff) << 8 );
  }
  public static byte[] ushortToBytes(int n) {
    byte[] b = new byte[2];
    b[1] = (byte) ( n    & 0xff);
    b[0] = (byte) ((n >> 8) & 0xff);
    return b;
  }
  public static void ushortToBytes(int n, byte[] array, int offset ) {
    array[offset+1] = (byte) ( n    & 0xff);
    array[offset] = (byte)  ((n >> 8) & 0xff);
  }
  public static int bytesToUshort(byte b[]) {
    return  b[1] & 0xff
        | (b[0] & 0xff) << 8;
  }
  public static int bytesToUshort(byte b[], int offset) {
    return  b[offset+1] & 0xff
        | (b[offset]  & 0xff) << 8;
  }
  public static byte[] ubyteToBytes( int n ){
    byte[] b = new byte[1];
    b[0] = (byte) (n & 0xff);
    return b;
  }
  public static void ubyteToBytes( int n, byte[] array, int offset ){
    array[0] = (byte) (n & 0xff);
  }
  public static int bytesToUbyte( byte[] array ){
    return array[0] & 0xff;
  }
  public static int bytesToUbyte( byte[] array, int offset ){
    return array[offset] & 0xff;
  }
  // char 類型、 float、double 類型和 byte[] 數(shù)組之間的轉(zhuǎn)換關(guān)系還需繼續(xù)研究實現(xiàn)。
}

分享文章:利用Java在將整型數(shù)與byte[]數(shù)組進行轉(zhuǎn)換-創(chuàng)新互聯(lián)
地址分享:http://muchs.cn/article0/dpidio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、響應(yīng)式網(wǎng)站、做網(wǎng)站、網(wǎng)站設(shè)計公司、標簽優(yōu)化、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)