2011-06-14 19 views
3

我不知道如何使用byte []的一部分沒有arraycopy?如何在不使用arraycopy的情況下使用byte []的一部分?

在C語言

char buf[100]; 
int i; 

for (i = 0; i < 100; i += 10) { 
    proc(buf + i); 
} 

在Java

byte[] buf = new byte[100]; 
int i; 

for (i = 0; i < 100; i += 10) { 
    proc(buf + i); 
} 

沒有奏效。

byte[] buf = new byte[100]; 
int i; 

for (i = 0; i < 100; i += 10) { 
    byte[] temp = new byte[10]; 
    System.arraycopy(buf, i, temp, 0, 10); 
    proc(temp); 
} 

只工作。

但是,我不喜歡arraycopy。

我該如何解決這個問題?

+0

我糊塗了......你想'PROC()'要修改'buf'陣列或不?在你的C代碼中,這是可能的,但不是在Java代碼中。 – stevevls 2011-06-14 07:45:15

+0

'proc()'在做什麼?請包括這一點,以便我們可以提出解決方案。不知道proc會如何使用這些數據,很難理解你想要做什麼,因此實際上你的問題是什麼。 – 2011-06-14 07:46:40

+0

你怎麼給int數組添加一個int? – Fractaly 2011-12-10 22:53:33

回答

1

只是傳遞一個指標參數,以此來proc

void proc(byte[] array, int index) 
{ 
    for (int i = index; i < array.length; ++i) 
    { 
     // do something 
    }  
} 
8

你總是可以延長你的「過程」功能採取3個參數,像這樣:

proc(byte[] a, int offset, int length) 

這是模仿C-的最佳方式Java中的數組功能。

+0

借調。這是一個非常習慣的方法,在標準庫的許多地方都有使用。 – musiKk 2011-06-14 07:51:34

+0

「proc」函數修改「buf」參數,比如進行排序或其他操作。 (什麼proc做不是問題。)我只是想修改參數沒有arraycopy或索引。 – killinggun 2011-06-14 07:54:46

+3

這是一個看似簡單的問題,但如果您來自C背景則非常相關。基本上,你不得不忘記你所有的指針思維。 Java中沒有等價的概念。上面提到的brandx幾乎是處理原始數組的標準模式。 – pap 2011-06-14 07:56:47

0

在C中,一個陣列是隻是一個指向存儲器的某處,並BUF + i具有含義(這意味着在存儲器中的地方,我字節上 - 這也是一個數組)

Java中的數組是一個附有長度和代碼的對象。沒有辦法引用「數組中的數組」,而「+」運算符沒有意義。

+0

嗯。那麼就沒有辦法像C那樣做。只有arraycopy或傳遞帶有buf的索引參數。 thx爲您的答案。 – killinggun 2011-06-14 07:58:57

1

嘗試用下面的代碼,而不是arraycopy

byte[] buf = new byte[100]; 
     int i; 

     for (i = 0; i < 100; i += 10) { 
      byte[] temp = new byte[10]; 
        temp[i%10] = buf[i]; 



     } 

感謝 迪帕克

+0

這只是arraycopy的另一個代碼。它沒有幫助。 – killinggun 2011-06-14 08:00:35

1

由於沒有一個答案包括ByteBuffer的,我會告訴另一種方式:

import java.nio.ByteBuffer; 

public class ProcByteBuffer { 

    private static final int BUF_SIZE = 10; 
    private static final int BIG_BUF_SIZE = 10 * BUF_SIZE; 

    public static void proc(final ByteBuffer buf) { 

     // for demo purposes 
     while (buf.hasRemaining()) { 
      System.out.printf("%02X", Integer.valueOf(buf.get() & 0xFF)); 
     } 
    } 

    public static void main(String[] args) { 
     final ByteBuffer bigBuf = ByteBuffer.allocate(BIG_BUF_SIZE); 

     // for demo purposes 
     for (int i = 0; i < BIG_BUF_SIZE; i++) { 
      bigBuf.put((byte) i); 
     } 
     bigBuf.position(0); 

     for (int i = 0; i < BIG_BUF_SIZE; i += BUF_SIZE) { 
      bigBuf.position(i); 
      bigBuf.limit(i + BUF_SIZE); 
      proc(bigBuf.slice()); 
     } 
    } 
} 

任何變化到片(proc()的buf參數)將對底層數組可見。

3

java.util.Arrays有像一些有用的方法:

byte[] buf = new byte[100]; 
int i; 

for (i = 0; i < 100; i += 10) { 
    proc(Arrays.copyOfRange(buf, i, buf.length)); 
} 

更多:copyOfRange

相關問題