标签: bytebuffer

ByteBuffer - CompareTo 方法可能会出现分歧

根据此处的文章,处理负数时,ByteBuffers 上的compareTo 方法可能无法正常工作

bytes in Java are signed, contrary to what one typically expects. What is easy to miss
though, is the fact that this affects ByteBuffer.compareTo() as well. The Java API
documentation for that method reads:

"Two byte buffers are compared by comparing their sequences of remaining elements 
lexicographically, without regard to the starting position of each sequence within its
corresponding buffer."

A quick reading might lead one to believe the result is what you would typically …
Run Code Online (Sandbox Code Playgroud)

java nio bytebuffer compareto

5
推荐指数
1
解决办法
529
查看次数

为什么 copyPixelsFromBuffer 给出的颜色不正确?setPixels 正确但速度慢

对于我的 Android 应用程序,我ByteBuffer从本机代码中获取了一个。它包含创建位图的像素颜色值。

原始图像 -

在此输入图像描述

我在位copyPixelsFromBuffer图上使用,但在显示位图时得到的颜色不正确。

这是这种方法的代码 -

方法一

ByteBuffer buffer = ...

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
buffer.rewind();
bitmap.copyPixelsFromBuffer(buffer);
Run Code Online (Sandbox Code Playgroud)

大约。时间- ~0.4 ms
结果- 颜色错误 -
在此输入图像描述

方法2

接下来我尝试了setPixels。它仍然给出错误的颜色,速度慢 10 倍以上,并且需要额外的内存int[]。请注意,这buffer.hasArray()false,所以我无法从缓冲区获取数组。

ByteBuffer buffer = ...

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
buffer.rewind();

int[] pixels = new int[width * height];

for (int i = 0; i < width * height; i++) {
    int a = buffer.get();
    int …
Run Code Online (Sandbox Code Playgroud)

performance android bytebuffer colors bitmap

5
推荐指数
1
解决办法
2359
查看次数

java.lang.UnsupportedOperationException at java.nio.ByteBuffer.array(ByteBuffer.java:959)

以下 Java 代码可以编译,但在运行时出现错误:

\n\n
# javac ByteBufTest.java\n# java ByteBufTest\nException in thread "main" java.lang.UnsupportedOperationException\n    at java.nio.ByteBuffer.array(ByteBuffer.java:959)\n    at ByteBufTest.<init>(ByteBufTest.java:12)\n    at ByteBufTest.main(ByteBufTest.java:33)\n# \n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么会出现这种情况?

\n\n

注意\xef\xbc\x9a接下来,我需要在JNI中使用mDirectBuffer,所以我必须使用ByteBuffer.allocateDirect(TEST_BUFFER_SIZE)函数\xe3\x80\x82

\n\n

ByteBufTest.java:

\n\n
import java.nio.ByteBuffer;\n\npublic class ByteBufTest {\n\n    public static final int TEST_BUFFER_SIZE = 128;\n\n    private ByteBuffer mDirectBuffer;\n\n    public ByteBufTest() {\n        mDirectBuffer = ByteBuffer.allocateDirect(TEST_BUFFER_SIZE);\n        byte[] buf = mDirectBuffer.array();\n        buf[1]=100;\n    }\n\n    public void test() {\n\n        printBuffer("nativeInitDirectBuffer",mDirectBuffer.array());\n\n    }\n\n    private void printBuffer( String tag, byte[] buffer ) {\n        StringBuffer sBuffer = new StringBuffer();\n        for( int i=0; i<buffer.length; i++ …
Run Code Online (Sandbox Code Playgroud)

java bytebuffer

5
推荐指数
1
解决办法
8166
查看次数

如何在 Kotlin 中将数据类转换为 ByteBuffer?

我正在尝试使用 Kinesis,它需要字节缓冲区格式的数据。到目前为止,我看到的所有示例都是用 Java 编写的,并传递简单的字符串。任何人都可以知道如何将 kotlin 数据类转换为 bytebuffer 吗?

例如数据类 abc ( var a: Long, var b: String, var c: Double )

bytebuffer kotlin aws-sdk amazon-kinesis-kpl

5
推荐指数
2
解决办法
1万
查看次数

直接 java.nio.ByteBuffer vs Java Array 性能测试

我想比较直接字节缓冲区(java.nio.ByteBuffer,堆外)和堆缓冲区(通过数组实现)的读取和写入性能。我的理解是,ByteBuffer 在堆外比堆缓冲区至少有两个好处。首先,它不会被 GC 考虑,其次(我希望我做对了)JVM 在读取和写入它时不会使用中间/临时缓冲区。这些优点可能使堆外缓冲区比堆缓冲区更快。如果这是正确的,我不应该期望我的基准显示相同吗?它总是比非堆缓冲区更快地显示堆缓冲区。

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(value = 2, jvmArgs = {"-Xms2G", "-Xmx4G"})
@Warmup(iterations = 3)
@Measurement(iterations = 10)
public class BasicTest {

    @Param({"100000"})
    private int N;

    final int bufferSize = 10000;

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8 * bufferSize);
    long buffer[] = new long[bufferSize];


    public static void main(String arep[]) throws  Exception {

        Options opt = new OptionsBuilder()
                .include(BasicTest.class.getSimpleName())
                .forks(1)
                .build();

        new Runner(opt).run();

    }


    @Benchmark
    public void offHeapBuffer(Blackhole blackhole) {

        IntStream.range(0, bufferSize).forEach(index -> {
            byteBuffer.putLong(index, 500 * index);
            blackhole.consume(byteBuffer.get(index));
        }); …
Run Code Online (Sandbox Code Playgroud)

java bytebuffer jmh

5
推荐指数
1
解决办法
2882
查看次数

在 Dart 中将 ByteBuffer 快速复制到 ByteBuffer

如何在 Dart 中将 ByteBuffer 的字节快速复制到另一个更大的 ByteBuffer(以非零偏移量)?

有一些缓慢的方法可以做到这一点。一种是将每个都转换为 Uint8List 并一次复制一个索引。另一种方法是将每个转换为 Uint8List,为第一个获取迭代器,然后调用setRange()第二个。

我认为应该有一种更直接的方法来要求 Dart API 快速将字节序列从一个缓冲区复制到另一个缓冲区。API 可以本地优化此副本。如果不是,那么最快的方法是什么?

bytebuffer copy dart

5
推荐指数
1
解决办法
156
查看次数

从 InputStream 获取 Publisher&lt;ByteBuffer&gt;

我刚刚升级了 mongo-db-java-driver,现在方便的功能GridFSBucket.uploadFromStream已经消失了。因此我们现在得到了一个

GridFSUploadPublisher<ObjectId> uploadFromPublisher(String filename, Publisher<ByteBuffer> source);
Run Code Online (Sandbox Code Playgroud)

有什么想法如何将我的 InputStream 转换为 吗Publisher<ByteBuffer>?java驱动程序或Reactor中有任何实用函数吗?

java bytebuffer publisher reactor mongodb-java

5
推荐指数
1
解决办法
1710
查看次数

将多个 ByteBuffer 读入单个字符串的节省空间的方法是什么?

我正在编写一个解码器,它将接收一系列字节缓冲区并将内容解码为单个String. 可以有任意数量的字节缓冲区,每个缓冲区包含任意数量的字节。缓冲区不一定在字符边界上分割,因此根据编码,它们可能在开头或结尾包含部分字符。这就是我想要做的,StringByteStreamDecoder我需要编写的新类在哪里。

suspend fun decode(data: Flow<ByteBuffer>, charset: Charset): String {
    val decoder = StringByteStreamDecoder(charset)
    data.collect { bytes ->
        decoder.feed(bytes)
    }
    decoder.endOfInput()
    return decoder.toString()
}
Run Code Online (Sandbox Code Playgroud)

尝试1

最简单的方法是将所有字节缓冲区收集到一个字节数组中。我拒绝了这种方法,因为它具有显着的内存开销。它需要为完整消息分配空间至少两次:一次为原始字节,一次为解码字符。这是我的简单实现,使用 aByteArrayOutputStream作为扩展字节缓冲区。

class StringByteStreamDecoder(private val charset: Charset) {
    private val buffer = ByteArrayOutputStream()

    fun feed(data: ByteBuffer) {
        if (data.hasArray()) {
            buffer.write(data.array(), data.position() + data.arrayOffset(), data.remaining())
        } else {
            val array = ByteArray(data.remaining())
            data.get(array)
            buffer.write(array, 0, array.size)
        }
    }

    fun endOfInput() {
        buffer.flush()
    }

    override fun toString(): String {
        return …
Run Code Online (Sandbox Code Playgroud)

nio bytebuffer nonblocking kotlin kotlin-flow

5
推荐指数
1
解决办法
1022
查看次数

JIT 预热后,如何使 ByteBuffer 与直接 byte[] 访问一样高效?

我正在尝试优化一个简单的解压缩例程,并遇到了这个奇怪的性能怪癖,我似乎找不到太多信息:手动实现的简单字节缓冲区比内置字节缓冲区(堆)快 10%-20% & 映射)用于简单操作(读取一个字节,读取 n 个字节,是否是流末尾)

\n

我测试了3个API:

\n
    \n
  • 方法ByteBuffer.wrap(byte[])
  • \n
  • 原始字节[]访问
  • \n
  • 字节访问的简单包装器上的方法(大部分)镜像 ByteBuffer API
  • \n
\n

简单的包装器:

\n
class TestBuf {\n    private final byte[] ary;\n    private int pos = 0;\n\n    public TestBuf(ByteBuffer buffer) {  // ctor #1\n        ary = new byte[buffer.remaining()];\n        buffer.get(ary);\n    }\n    \n    public TestBuf(byte[] inAry) { // ctor #2\n        ary = inAry;\n    }\n\n    public int readUByte() { return ary[pos++] & 0xFF; }\n\n    public boolean hasRemaining() { return pos < ary.length; }\n\n    public void get(byte[] …
Run Code Online (Sandbox Code Playgroud)

java performance jvm bytebuffer jmh

5
推荐指数
1
解决办法
721
查看次数

Android下载文件内存不足

我试图下载一个开始时不到22 MB的zip文件.我在这些异常之后更改了默认的BufferedInputStream,但仍然出现内存不足错误.

public void downloadFromUrl(String fileName) {

        //avoid unknown host exception
        try {

            InetAddress i = InetAddress

                    .getByName("http://xxx/Android/" + fileName);

        } catch (UnknownHostException e1) {

            e1.printStackTrace();

        }

        try {

            URL url = new URL("http://xxx/Android/" + fileName);
            File file = new File(fileName);

            long startTime = System.currentTimeMillis();
            Log.d("DownloadManager", "download begining");
            Log.d("DownloadManager", "download url:" + url);
            Log.d("DownloadManager", "downloaded file name:" + fileName);

            URLConnection ucon = url.openConnection();

            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is, 23 * 1024);

            ByteArrayBuffer baf = new ByteArrayBuffer(23 …
Run Code Online (Sandbox Code Playgroud)

java android bytebuffer

4
推荐指数
2
解决办法
8612
查看次数