我正在从设备读取 byte[] 并尝试在 ByteBuffer 类的帮助下将其解释为 Java 中的整数数组,但出现索引越界错误。看这里:
byteBuffer.put(bytes); // put the array of bytes into the byteBuffer
System.out.println("the value I want is " + byteBuffer.getInt(16*4)); // gives me the number I want, but I'd rather deal with an integer array like this:
System.out.println("the value I want is " + byteBuffer.asIntBuffer().get(16)); // index out of bounds? Why??
Run Code Online (Sandbox Code Playgroud) 我有一个 ByteBuffer,我需要将其内容添加到 POST 请求中,以便远程显示代表的图像;但我不知道该怎么做。
这样做是行不通的:
byteBuffer.array()
Run Code Online (Sandbox Code Playgroud)
我尝试将其转换为字节数组,但它不起作用,因为图像无法正确显示:
byte[] byteArray = new byte[byteBuffer.remaining()];
frame.duplicate().get(byteArray);
HttpResponse response = null;
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(URL);
post.setEntity(new ByteArrayEntity(byteArray));
Run Code Online (Sandbox Code Playgroud)
我也考虑过将其转换为图像并获取其字节数组,但我不知道如何做到这一点以及它是否有效......
任何帮助将不胜感激。
如何从 JavaByteBuffer中读取以 NUL 结尾的 UTF-8 字符串ByteBuffer#position()?
ByteBuffer b = /* 61 62 63 64 00 31 32 34 00 (hex) */;\nString s0 = /* read first string */;\nString s1 = /* read second string */;\n\n// `s0` will now contain \xe2\x80\x9cABCD\xe2\x80\x9d and `s1` will contain \xe2\x80\x9c124\xe2\x80\x9d.\nRun Code Online (Sandbox Code Playgroud)\n我已经尝试过使用Charsets.UTF_8.decode(b),但似乎这个函数忽略当前ByteBuffer位置并读取直到缓冲区末尾。
有没有更惯用的方法从字节缓冲区读取此类字符串,而不是寻找包含 0 的字节并将缓冲区限制为它(或将带有字符串的部分复制到单独的缓冲区中)?
\n在java.nio包中,ByteBuffer和CharBuffer有什么区别.它与byte和char有相同的区别吗?
下面是我写的代码.我想做一件简单的事情,将二进制文件数据存储到byteBuffer中.
File file = new File(fileName);
try {
ReadableByteChannel channel = new FileInputStream(fileName).getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect(file.length());
// How can use buf.read to get all the contents?
} catch (Exception e){
}
Run Code Online (Sandbox Code Playgroud)
我在想
read从通道获取所有数据并将其存储在ByteBuffer中ByteBuffer,除了使用Fileobject来获取文件的长度JNIEXPORT jboolean JNICALL Java_directshowcamera_dsInterface_grab_1frame_1stream(JNIEnv *env, jobject obj, jint streamid, jobject barray)
{
jclass bbclass = env->FindClass( "java/nio/ByteBuffer" );
jmethodID putMethod = env->GetMethodID(bbclass, "put", "(I, B)Ljava/nio/ByteBuffer");
unsigned char *buffer = stream_buffer( streamid );
if( !stream_image_ready( streamid ) ) return (jboolean)0;
for(int i=0; i < stream_device_size( streamid ); i++ ) {
env->CallByteMethod( barray, putMethod, i, (jbyte)buffer[i] );
}
return (jboolean)1;
}
Run Code Online (Sandbox Code Playgroud)
所以,我有一个字节缓冲区,并且在Java中我已经分配了适当的大小,并注意到可以使用ByteBuffer.put(索引,字节),所以我试图获得该方法,但是当我在Java中时,我获得以下运行时异常:
java.lang.NoSuchMethodError:put
我做错了什么想法?我不太了解JNI,并且大部分时间都是我在网上找到的重复工作示例.
我目前从ByteBuffer读取一个短值并将其应用于int.
byte[] data = new byte{0x90, 0xAF};
ByteBuffer b = ByteBuffer.wrap(data);
int value = b.getShort();
Run Code Online (Sandbox Code Playgroud)
但是value包含现在0xFFFF90AF而不是0x90AF.我的解决方案是通过0xFFFF以下方式将值掩盖:int value = b.getShort() & 0xFFFF;
我认为一个上流总是可能的,因为short小于int.有人能解释为什么它会像这样吗?
这就是我的意思:
put 512 bytes
SocketChannel#write(this data)
start at the beginning and put 512 bytes again
rinse & repeat
Run Code Online (Sandbox Code Playgroud)
我仍然试图掌握ByteBuffers并尝试使用ByteBuffer#reset()但我总是得到一个InvalidMarkException,即使这似乎是正确的解决方案(除非我错了,我不会感到惊讶!)
谢谢!
编辑:具体来说,我正在尝试实现同样的效果,除了我想以512字节块而不是批量发送它. http://privatepaste.com/1fb0e6df07
这是我一直在关注的一些代码:
public static long getUnsignedInt(ByteBuffer buff) {
return (long) (buff.getInt() & 0xffffffffL);
}
Run Code Online (Sandbox Code Playgroud)
有没有理由这样做buff.getInt() & 0xffffffffL(0xffffffffL在32个最低有效位中有32位1)?在我看来,结果将永远是buff.getInt().
首先,我想说旧的答案不起作用(例如,下面的答案中的GetDirectBufferAddress函数现在想要一个参数),如下所示:
和这里,
如果有人帮忙会更好..
因此,我无法使用JNI正确地将我的ByteBuffer(其中一些元素已填充)从Java发送到C,并且我无法将该ByteBuffer的元素再次返回到C
我的本地功能解除:
public native int myfunc(ByteBuffer pkt);
Run Code Online (Sandbox Code Playgroud)
分配给它
private ByteBuffer pkt = ByteBuffer.allocate(1000);
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
System.out.println(myfunc(pkt)); // Doesn't works, throws exception
pkt.position(0);
System.out.println(pkt.get()); // works, when I do comment line above .println
Run Code Online (Sandbox Code Playgroud)
我的C代码如下:
JNIEXPORT jint JNICALL Java_xxx_myfunc(JNIEnv *, jobject, jobject); // header
JNIEXPORT jint JNICALL Java_xxx_myfunc(JNIEnv *env, jobject obj, jobject pkt) // function
{
jbyte *buff = (jbyte *) env->GetDirectBufferAddress(pkt);
// buff[0] = 0; I've also tried in this way
return buff[0];
//return 1; …Run Code Online (Sandbox Code Playgroud)