/*
* Copyright ( C ) 2008 The Android Open Source Project
*
* Licensed under the Apache License , Version 2 . 0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.nio.ShortBuffer;
public class Main {
public static void main(String[] args) {
ByteBuffer buf = ByteBuffer.allocateDirect(16 );
System.out.println("Direct byte buffer has array: " + buf.hasArray());
intFloatTest();
basicShortTest();
primTest();
}
/*
* Create a buffer and fiddle with it .
*/
public static void basicShortTest() {
ByteBuffer directBuf = ByteBuffer.allocateDirect(64 );
//ByteBuffer directBuf = ByteBuffer.allocateDirect(65);
ShortBuffer shortBuf = directBuf.asShortBuffer();
short [] myShorts = {
1000 , 1001 , 1002 , 1003 , 1004 , 1005 , 1006 , 1007 ,
1008 , 1009 , 1010 , 1011 , 1012 , 1013 , 1014 , 1015 ,
1016 , 1017 , 1018 , 1019 , 1020 , 1021 , 1022 , 1023 ,
1024 , 1025 , 1026 , 1027 , 1028 , 1029 , 1030 , 1031
};
shortBuf.position(0 );
shortBuf.put(myShorts, 0 , 32 ); // should work
shortBuf.position(0 );
shortBuf.put(myShorts, 16 , 16 ); // should work
shortBuf.put(myShorts, 16 , 16 ); // advance to end
try {
shortBuf.put(myShorts, 0 , 1 ); // should fail
System.out.println("ERROR: out-of-bounds put succeeded\n" );
} catch (BufferOverflowException boe) {
System.out.println("Got expected buffer overflow exception" );
}
try {
shortBuf.position(0 );
shortBuf.put(myShorts, 0 , 33 ); // should fail
System.out.println("ERROR: out-of-bounds put succeeded\n" );
} catch (IndexOutOfBoundsException ioobe) {
System.out.println("Got expected out-of-bounds exception" );
}
try {
shortBuf.position(16 );
shortBuf.put(myShorts, 0 , 17 ); // should fail
System.out.println("ERROR: out-of-bounds put succeeded\n" );
} catch (BufferOverflowException boe) {
System.out.println("Got expected buffer overflow exception" );
}
}
/*
* Try this with either floats or ints ; ints fail with
* BufferOverflowException , floats work .
*
* From http : //code.google.com/p/android/issues/detail?id=1585 .
*/
public static void intFloatTest() {
ByteBuffer direct = ByteBuffer.allocateDirect(100 );
direct.order(ByteOrder.nativeOrder());
IntBuffer int1 = direct.asIntBuffer();
int data[] = new int [25 ];
//FloatBuffer int1 = direct.asFloatBuffer();
//float data[] = new float[25];
int1.clear ();
int1.put (data);
int1.position (0 );
int1.clear ();
int1.put (data);
int1.position (0 );
}
/*
* Exercise all " view buffer " classes , in both byte orders .
*/
public static void primTest() {
ByteBuffer directBuf = ByteBuffer.allocateDirect(36 );
directBuf.order(ByteOrder.BIG_ENDIAN);
storeValues(directBuf);
for (int i = 0 ; i < 36 ; i++) {
directBuf.put(i, (byte ) 0 xcc);
}
directBuf.order(ByteOrder.LITTLE_ENDIAN);
storeValues(directBuf);
}
static void storeValues(ByteBuffer directBuf) {
directBuf.position(0 );
ShortBuffer shortBuf = directBuf.asShortBuffer();
CharBuffer charBuf = directBuf.asCharBuffer();
IntBuffer intBuf = directBuf.asIntBuffer();
FloatBuffer floatBuf = directBuf.asFloatBuffer();
LongBuffer longBuf = directBuf.asLongBuffer();
DoubleBuffer doubleBuf = directBuf.asDoubleBuffer();
final byte byteValue = -5 ;
final short shortValue = -1234 ;
final char charValue = 49200 ;
final int intValue = 0 x12345678;
final float floatValue = 3 .14159 f;
final long longValue = 0 x1122334455667788L;
final double doubleValue = Double .MIN_VALUE;
if (directBuf.put(1 , byteValue).get(1 ) != byteValue) {
throw new RuntimeException("byte get/store failed" );
}
if (shortBuf.put(1 , shortValue).get(1 ) != shortValue) {
throw new RuntimeException("short get/store failed" );
}
if (charBuf.put(2 , charValue).get(2 ) != charValue) {
throw new RuntimeException("char get/store failed" );
}
if (intBuf.put(2 , intValue).get(2 ) != intValue) {
throw new RuntimeException("int get/store failed" );
}
if (floatBuf.put(3 , floatValue).get(3 ) != floatValue) {
throw new RuntimeException("float get/store failed" );
}
if (longBuf.put(2 , longValue).get(2 ) != longValue) {
throw new RuntimeException("long get/store failed" );
}
if (doubleBuf.put(3 , doubleValue).get(3 ) != doubleValue) {
throw new RuntimeException("double get/store failed" );
}
directBuf.position(0 );
char [] outBuf = new char [directBuf.limit() * 2 ];
for (int i = 0 ; i < directBuf.limit(); i++) {
byte b = directBuf.get();
outBuf[i*2 ] = hexChar((byte ) ((b >> 4 ) & 0 x0f));
outBuf[i*2 +1 ] = hexChar((byte ) (b & 0 x0f));
}
System.out.println(new String(outBuf));
}
static char hexChar(byte b) {
if (b < 10 ) {
return (char ) ('0' + b);
} else {
return (char ) ('a' + b - 10 );
}
}
}
Messung V0.5 in Prozent C=85 H=98 G=91
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-29)
¤
*© Formatika GbR, Deutschland