标签: bytebuffer

Java - ByteBuffer.remaining()问题

简介:我有一个ByteBuffer,我在其中提取一些数据.之后,我想通过Socket发送这些数据.

所以,我写了这样的代码:

    private static void serialize(ByteBuffer buffer, EmployeeData emp, CharsetEncoder encoder)
{
    // id
    buffer.putInt(emp.getId());

    CharBuffer nameBuffer = CharBuffer.wrap(emp.getFirstName().toCharArray());
    ByteBuffer nbBuffer = null;

    // length of first name
    try
    {
        nbBuffer = encoder.encode(nameBuffer);
    } 
    catch(CharacterCodingException e)
    {
        throw new ArithmeticException();
    }

    System.out.println(String.format("String [%1$s] #bytes = %2$s", emp.getFirstName(), nbBuffer.limit()));
    buffer.putInt(nbBuffer.limit());
    buffer.put(nbBuffer);

    // put lastname
    nameBuffer = CharBuffer.wrap(emp.getLastName().toCharArray());
    nbBuffer = null;

    // length of first name
    try
    {
        nbBuffer = encoder.encode(nameBuffer);          
    } 
    catch(CharacterCodingException e)
    {
        throw new ArithmeticException();
    }

    System.out.println(String.format("String [%1$s] #bytes …
Run Code Online (Sandbox Code Playgroud)

java bytebuffer

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

Java ByteBuffer发出有符号和无符号类型的问题,将字节数组转换为整数

我期待这个:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222
Run Code Online (Sandbox Code Playgroud)

但是以下情况属实:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344
Run Code Online (Sandbox Code Playgroud)

我如何解决Java在签名/未签名类型中的许多限制,或者我是否需要完全自己滚动?

java unsigned signed bytebuffer

4
推荐指数
1
解决办法
4091
查看次数

这个Java ByteBuffer的行为有解释吗?

我需要将数值转换为字节数组.例如,要将long转换为byte数组,我有以下方法:

public static byte[] longToBytes(long l) {
  ByteBuffer buff = ByteBuffer.allocate(8);

  buff.order(ByteOrder.BIG_ENDIAN);

  buff.putLong(l);

  return buff.array();
}
Run Code Online (Sandbox Code Playgroud)

这很简单 - 花一点时间,分配一个可以容纳它的数组,然后把它扔进那里.无论价值l是多少,我都会得到一个8字节的数组,然后我可以按照预期进行处理和使用.就我而言,我正在创建一个自定义二进制格式,然后通过网络传输它.

当我使用值773450364调用此方法时,我得到一个数组[0 0 0 0 46 25 -22 124].我有代码也将字节数组转换回它们的数值:

public static Long bytesToLong(byte[] aBytes, int start) {
  byte[] b = new byte[8];

  b[0] = aBytes[start + 0];
  b[1] = aBytes[start + 1];
  b[2] = aBytes[start + 2];
  b[3] = aBytes[start + 3];
  b[4] = aBytes[start + 4];
  b[5] = aBytes[start + 5];
  b[6] = aBytes[start + 6];
  b[7] …
Run Code Online (Sandbox Code Playgroud)

java byte bytebuffer bytearray inputstream

4
推荐指数
1
解决办法
2463
查看次数

在bytebuffer中查找字符串

我正在从C切换到Java.我想知道如何在bytebuffer中找到一个字符串,在java中有类似memchr的东西吗?bytebuffer只是部分字符串,其余是原始字节,因此任何java方法都必须处理字节+字符.

我也在搜索java中的strsep以分割字符串.

java string bytebuffer

4
推荐指数
1
解决办法
4977
查看次数

从Java ByteBuffer中的byte获取低阶和高阶nybbles

我需要从存储在ByteBuffer(小端序)中的字节中提取两个整数值

ByteBuffer bb = ByteBuffer.wrap(inputBuffer);
bb.order(ByteOrder.LITTLE_ENDIAN);
Run Code Online (Sandbox Code Playgroud)

我需要从ByteBuffer中的任何字节获取的值是:

length =低阶半字节的整数值

frequency =高阶半字节的整数值

目前我正在使用以下代码提取低阶nybble:

length = bb.getInt(index) & 0xf;
Run Code Online (Sandbox Code Playgroud)

这看起来效果很好.然而,这似乎是高阶nybble我似乎无法正确解释.

我对位移或屏蔽感到有些困惑,我认为我需要执行它,任何建议都会非常有用.

非常感谢!!

java byte bytebuffer mask bit-shift

4
推荐指数
1
解决办法
4430
查看次数

用小端写一个整数

我必须写一个文件4bytes表示一个小端的整数(java使用大端),因为外部c ++应用程序必须读取此文件.我的代码不在te文件中写任何东西,但de buffer里面有数据.为什么?我的功能:

public static void copy(String fileOutName, boolean append){
    File fileOut = new File (fileOutName);

    try {
         FileChannel wChannel = new FileOutputStream(fileOut, append).getChannel();

         int i = 5;
         ByteBuffer bb = ByteBuffer.allocate(4);
         bb.order(ByteOrder.LITTLE_ENDIAN);
         bb.putInt(i);

         bb.flip();

         int written = wChannel.write(bb);
         System.out.println(written);    

         wChannel.close();
     } catch (IOException e) {
     }
}
Run Code Online (Sandbox Code Playgroud)

我的电话:

copy("prueba.bin", false);
Run Code Online (Sandbox Code Playgroud)

java io nio bytebuffer endianness

4
推荐指数
1
解决办法
4764
查看次数

使用Bytebuffer写出的返回与简单的写出不同

我正在尝试将字节数据写入文件并进行优化,我希望减少写入文件的次数.

目前,我正在使用:

try (RandomAccessFile out = new RandomAccessFile(file, "rw")) {

    for(int i = 0; i < totalPkts; i++) {
        out.writeInt(data.get(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但由于有很多out.write调用,所以速度很慢.

所以相反,我试图用a ByteBuffer来代替:

try (RandomAccessFile out = new RandomAccessFile(file, "rw")) {
    ByteBuffer buffer = ByteBuffer.allocate(totalPkts*4); // prevent BufferOverflow

    for(int i = 0; i < totalPkts; i++) {
        buffer.putInt(data.get(i));
    }
    out.write(buffer.array());
}
Run Code Online (Sandbox Code Playgroud)

这两种方法生成的文件大小不同.该ByteBuffer文件几乎比普通输出文件大整整mb.这可以解释为什么差异会说他们不一样.

我尝试使用DataOutputStream,结果是一样的.使用的文件ByteBuffer仍然比不使用的文件大约1mb ByteBuffer.

java bytebuffer randomaccessfile

4
推荐指数
1
解决办法
4168
查看次数

将两个byteBuffers连接到一个

嗨,我有2个byteBuffers,我想将它们连接到一个byteBuffer.我在这里找到了一个类似的问题,但没有一个建议对我有用.

java bytebuffer concatenation

4
推荐指数
1
解决办法
1835
查看次数

Java GC如何清除直接字节缓冲区,因为IBM Docs说了。

我以为,我了解Bytebuffer和DirectByteBuffer的不同之处,直到我读了IBM文档上的一篇文章,提及:

“直接ByteBuffer对象自动清除其本机缓冲区,但只能作为Java堆GC的一部分来清除”

https://www.ibm.com/developerworks/library/j-nativememory-linux/

现在我无法理解这一行,因为它说DirectByteBuffer确实作为Java堆GC的一部分进行了清理。

IFAIK,Java堆GC仅在Java堆(未分配DirectByteBuffer的区域)中进行清理。它(GC)不知道本机内存(分配DirectByteBuffer的位置)。

请帮助我理解这条线,或者如果我的理解存在差距

java garbage-collection jvm nio bytebuffer

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

有没有办法在Java中gzip字节缓冲区?

我有相当大的DirectByteBuffer,我想DirectByteBuffer从它生成一个gzip 而不将其内容传输到堆.

标准java.util.Deflater没有用,因为它按照byte[]定义在堆上运行.

有没有办法在Java中这样做?或者我必须libzip直接打电话JNI

java gzip jvm nio bytebuffer

4
推荐指数
1
解决办法
273
查看次数