2013-01-01 86 views
3

如何將長轉換爲4字節?我正在從C程序接收一些輸出,並使用無符號long。我需要讀取這個輸出並將其轉換爲4個字節。Java將長轉換爲4字節

但是,java使用帶符號的64位長。有沒有辦法做這種轉換?

+0

你不能因爲咬了一口。爲什麼不使用多久?如果這是爲了優化,那麼你不應該打擾。 –

+0

'int'在Java中是32位的,這看起來比64位的'long'更合適。另外,**你是如何將數據從C傳遞給Java的? –

+0

如果你在C語言中對'byte [4]''進行'long unsigned int'轉換,並將它傳遞給Java(可能是逗號分隔的整數列表),那麼看起來似乎更合適。 –

回答

0

你可以編碼一個循環,你把「long」除以256,取其餘的,然後你有「最低有效字節」...... (取決於你是想要little-endian還是big-endian你可以向前或向後循環)

long l = (3* 256 * 256 * 256 + 1 * 256 *256 + 4 * 256 + 8); 
    private byte[] convertLongToByteArray(long l) { 
     byte[] b = new byte[4]; 
     if(java.nio.ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN){ 
      for (int i=0; i<4; i++) { 
      b[i] = (byte)(l % 256) ; 
      l = l/256; 
      } 
    }else{ 
      for (int i=3; i>=0; i--) { 
      b[i] = (byte)(l % 256) ; 
      l = l/256; 
      } 
    } 
     return b; 
    } 
+0

快來吧。除非需要很長的參數,否則該方法是無用的。對於硬編碼輸入,你可能會硬性輸出。 – EJP

+0

@EJP來吧,它看起來並不壞。這可能會給OP帶來一些思考空間。 –

+0

@EJP這只是一個例子。一個只需要聲明一個變量,然後在方法中傳遞它。無論如何,我更新了代碼 – Rahul

1

您可以使用java.nio.ByteBuffer。它可以解析很長時間,併爲您進行字節排序。

+0

長是8個字節的Java。 ByteBuffer會將其包裝在8個字節中。 – Rahul

+2

ByteBuffer會根據您的需要將其返回給您。我回答這個是因爲他說他從C程序獲取數據,這意味着字節順序也很重要。 – Zagrev

+0

是的,你是對的,但主要擔心的是將長的轉換爲4個字節,這將不會被這個解決方案實現 – Rahul

8

要讀取4個字節爲一個無符號的32位值,假設它是小端,以最簡單的做法是使用的ByteBuffer

byte[] bytes = { 1,2,3,4 }; 
long l = ByteBuffer.wrap(bytes) 
        .order(ByteOrder.LITTLE_ENDIAN).getInt() & 0xFFFFFFFFL; 

雖然l可以是一個符號的64位值它將只能在0和2之間^^ 32-1,這是一個無符號的32位值的範圍。

+0

只是一個簡短的說明。掩碼應該是0x0FFFFFFFFL以防止獲得擴展符號位。 – Zagrev

+0

@Zagrev 0x0FFFFFFFFL == 0xFFFFFFFFL文字不符號擴展,它們將是您設置的值。 –

+0

啊!我立場糾正。在我過去的這段時間裏這麼多次,現在只是一種反射。 – Zagrev