2012-03-27 15 views

Odpowiedz

-2

To nie jest problem ByteBuffer - nawet jeśli był unsigned - każdy bajt zapoznanie z nią zostanie podpisana tylko dlatego byte jest podpisana i nie możemy tego zmienić.

+3

śmieci. Bajty są bajty. To one traktowane jako podpisane jedynie znaczenie, gdy znak przedłużenia lub wykorzystując je jako wartości liczbowych. Wszystko, co musisz zrobić, to odczytać bajty na liczbę, która może pomieścić więcej bajtów niż ta, którą chcesz mieć "unsigned" ('int' dla' short's, 'long' dla' int's, 'BigInteger' dla 'long's, itp.). – Thor84no

+0

Pisanie własnej metody użytkowej robi & 0xff jest śmieciem –

+0

W końcu znalazłem fajną klasę w guava robiąc dokładnie to czego chcę http://docs.guava-libraries.googlecode.com/ git/javadoc/com/google/common/io/ByteArrayDataInput.html # readUnsignedByte% 28% 29 –

51

unsigned przykład ByteBuffer:

import java.nio.ByteBuffer; 

public class test { 
    public static short getUnsignedByte(ByteBuffer bb) { 
     return ((short) (bb.get() & 0xff)); 
    } 

    public static void putUnsignedByte(ByteBuffer bb, int value) { 
     bb.put((byte) (value & 0xff)); 
    } 

    public static short getUnsignedByte(ByteBuffer bb, int position) { 
     return ((short) (bb.get(position) & (short) 0xff)); 
    } 

    public static void putUnsignedByte(ByteBuffer bb, int position, int value) { 
     bb.put(position, (byte) (value & 0xff)); 
    } 

    // --------------------------------------------------------------- 

    public static int getUnsignedShort(ByteBuffer bb) { 
     return (bb.getShort() & 0xffff); 
    } 

    public static void putUnsignedShort(ByteBuffer bb, int value) { 
     bb.putShort((short) (value & 0xffff)); 
    } 

    public static int getUnsignedShort(ByteBuffer bb, int position) { 
     return (bb.getShort(position) & 0xffff); 
    } 

    public static void putUnsignedShort(ByteBuffer bb, int position, int value) { 
     bb.putShort(position, (short) (value & 0xffff)); 
    } 

    // --------------------------------------------------------------- 

    public static long getUnsignedInt(ByteBuffer bb) { 
     return ((long) bb.getInt() & 0xffffffffL); 
    } 

    public static void putUnsignedInt(ByteBuffer bb, long value) { 
     bb.putInt((int) (value & 0xffffffffL)); 
    } 

    public static long getUnsignedInt(ByteBuffer bb, int position) { 
     return ((long) bb.getInt(position) & 0xffffffffL); 
    } 

    public static void putUnsignedInt(ByteBuffer bb, int position, long value) { 
     bb.putInt(position, (int) (value & 0xffffffffL)); 
    } 

    // --------------------------------------------------- 

    public static void main(String[] argv) throws Exception { 
     ByteBuffer buffer = ByteBuffer.allocate(20); 

     buffer.clear(); 
     test.putUnsignedByte(buffer, 255); 
     test.putUnsignedByte(buffer, 128); 
     test.putUnsignedShort(buffer, 0xcafe); 
     test.putUnsignedInt(buffer, 0xcafebabe); 

     for (int i = 0; i < 8; i++) { 
      System.out.println("" + i + ": " 
        + Integer.toHexString((int) getUnsignedByte(buffer, i))); 
     } 

     System.out.println("2: " 
       + Integer.toHexString(getUnsignedShort(buffer, 2))); 
     System.out.println("4: " + Long.toHexString(getUnsignedInt(buffer, 4))); 
    } 
} 
1

Java nie obsługuje niepodpisanych typów. Typowym rozwiązaniem jest przejście do następnego największego typu (w twoim przypadku: krótkiego) i po prostu zamaskuj go, abyś używał tylko niższych "n" (w twoim przypadku 8) bitów.

... ale tego rodzaju przerw podczas próby zastosowania do buforów :-(

Powiązane problemy