我正在用Java做内存映射的IO。FileChannel类允许您将ByteBuffer映射到文件的特定部分。我这样做是用只读方式打开的文件。
我遇到的问题是,当我尝试对生成的ByteBuffer调用.array()方法时遇到异常。也许是因为.array()返回byte []数组,而我真的想要一个最终的字节数组吗?
有没有办法解决?
我在Android 3.1中遇到UsbRequest类问题.
这是我的代码:
ByteBuffer buffer = ByteBuffer.allocate(4096);
buffer.order(ByteOrder.LITTLE_ENDIAN);
UsbRequest request = new UsbRequest();
request.initialize(mConnection, mEndpointIn);
request.queue(buffer, 4096);
if (mConnection.requestWait() == request) {
byte[] data = buffer.array();
}
Run Code Online (Sandbox Code Playgroud)
数组的大小data为4096,但实际接收的字节长度要小得多.
如何确定实际接收字节的大小?
谢谢.
我有一个像这样的类构造函数:
public JavoImageCorrectedDataHeader()
{
ByteBuffer buffer = ByteBuffer.allocate(this.size());
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
setByteBuffer(buffer, 0);
System.out.println("buffer.hasCode=" + buffer.hashCode());
}
Run Code Online (Sandbox Code Playgroud)
在我的其他课程中,我通过使用在不同的位置和时间创建了上述类的许多实例
new JavoImageCorrectedDataHeader()
Run Code Online (Sandbox Code Playgroud)
然后,我预计它将为它们打印出不同的hashCode.但我实际上看到打印出相同的hashCode:
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
Run Code Online (Sandbox Code Playgroud)
我必须想念如何使用ByteBuffer.
在我看来,MappedByteBuffer.isLoaded()始终false在Windows上返回.当我在BSD Unix上测试时,我得到true了相同的测试数据.
我应该担心吗?isLoaded()无论我使用什么尺寸的数据,我都无法在Windows上返回true.
这是我的测试代码供参考:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MemMapTest {
private static final String FILENAME = "mydata.dat";
private static final int MB_1 = 1048576; // one Mbyte
private static final byte[] testData = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // len = 10 bytes
public static void main(String[] args) throws FileNotFoundException, IOException {
// Create a …Run Code Online (Sandbox Code Playgroud) 好吧,所以我正在查找从字节数组转换为java中的数值的最佳方法是什么,我遇到了这个链接.第二个答案提到了ByteBuffer类的使用.对于那些不希望点击链接的人,最初问题是否我有:
byte[] by = new byte[8];
Run Code Online (Sandbox Code Playgroud)
如何将其转换为int?答案是......
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();
System.out.println(l);
Run Code Online (Sandbox Code Playgroud)
结果
4
Run Code Online (Sandbox Code Playgroud)
这真是太棒了,但我只是想在走这条路之前确认一些事情.
假设我之前读取的字节数组长度为8个字节.
byte[] oldByte = new byte[8];
Run Code Online (Sandbox Code Playgroud)
那我呢......
ByteBuffer bb = ByteBuffer.wrap(new byte[] {oldByte[2], oldByte[3]});
int intValue = bb.getInt();
Run Code Online (Sandbox Code Playgroud)
是否会以与前一个示例相同的方式读取/读取?
目前正在寻找Java和C#应用程序的接口.在Java中,我可以使用getShort(),getFloat()等等,从缓冲区中获得各种不同的数据类型.
在C#我使用的是a MemoryStream,但只有一个get()功能.有人知道数据类型甚至是模仿这个功能的类吗?
上下文:Spring数据cassandra官方1.0.2.RELEASE来自Maven Central repo,CQL3,cassandra 2.0,datastax driver 2.0.4
背景:cassandra blob数据类型映射到Java ByteBuffer.
下面的示例代码演示了您不会使用等效插入旁边的select来检索正确的字节.实际检索的数据以许多垃圾字节为前缀,实际上看起来像是整行的序列化.这篇与Cassandra 1.2相关的老帖子提示我们可能必须从长度为ByteBuffer.remaining()的ByteBuffer.arrayOffset()开始,但是arrayOffset值实际上是0.
我发现了一个spring-data-cassandra 2.0.0.SNAPSHOT但CassandraOperations API有很大的不同,它的包名也是:org.springdata ...与org.springframework ...
帮助解决这个问题,但非常欢迎.
与此同时,我似乎必须将Base64的二进制数据编码/解码到文本数据类型列.
---这里是我使用的简单表CQL元数据-------------
CREATE TABLE person (
id text,
age int,
name text,
pict blob,
PRIMARY KEY (id)
) ;
Run Code Online (Sandbox Code Playgroud)
---跟随映射到CQL表的简单数据对象---
package org.spring.cassandra.example;
import java.nio.ByteBuffer;
import org.springframework.data.cassandra.mapping.PrimaryKey;
import org.springframework.data.cassandra.mapping.Table;
@Table
public class Person {
@PrimaryKey
private String id;
private int age;
private String name;
private ByteBuffer pict;
public Person(String id, int age, String name, ByteBuffer pict) {
this.id = id; this.name = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将缓冲图像转换为 ByteBuffer,但出现此异常
java.awt.image.DataBufferInt cannot be cast to java.awt.image.DataBufferByte
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我并建议一个好的转换方法。
来源:
public static ByteBuffer convertImageData(BufferedImage bi)
{
byte[] pixelData = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData();
// return ByteBuffer.wrap(pixelData);
ByteBuffer buf = ByteBuffer.allocateDirect(pixelData.length);
buf.order(ByteOrder.nativeOrder());
buf.put(pixelData);
buf.flip();
return buf;
}
Run Code Online (Sandbox Code Playgroud)
这是我的对象
ByteBuffer buf = convertImageData(image);
Run Code Online (Sandbox Code Playgroud) 我在 Android 中开发了一个简单的音频播放器,可以播放 .mp3 文件。为了解码文件,我使用 Android MediaExtractor 和 Android MediaCodec。示例代码如下所示:
int inIndex = mDecoder.dequeueInputBuffer(TIMEOUT_US);
if (inIndex >= 0) {
ByteBuffer buffer = inputBuffers[inIndex];
int sampleSize = mExtractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
// We shouldn't stop the playback at this point, just pass the EOS
// flag to mDecoder, we will get it again from the
// dequeueOutputBuffer
Log.d(TAG, "InputBuffer BUFFER_FLAG_END_OF_STREAM");
mDecoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
}
else {
mDecoder.queueInputBuffer(inIndex, 0, sampleSize, mExtractor.getSampleTime(), 0);
mExtractor.advance();
}
Run Code Online (Sandbox Code Playgroud)
在我的所有测试设备上,代码运行没有任何问题。然而,在 Google Play …
的java.nio.ByteBuffer类有一个ByteBuffer.array()方法,然而,这将返回一个数组,它是该缓冲区的容量的大小,而不是使用容量。因此,我遇到了一些问题。
我有一个 ByteBuffer,我将其分配为某个大小,然后我将数据插入其中。
ByteBuffer oldBuffer = ByteBuffer.allocate(SIZE);
addHeader(oldBuffer, pendingItems);
newBuffer.flip();
oldBuffer.put(newBuffer);
// as of now I am sending everything from oldBuffer
send(address, oldBuffer.array());
Run Code Online (Sandbox Code Playgroud)
我怎么能只发送oldBuffer. 有没有一种班轮可以做到这一点?