简介:我有一个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) 我期待这个:
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在签名/未签名类型中的许多限制,或者我是否需要完全自己滚动?
我需要将数值转换为字节数组.例如,要将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) 我正在从C切换到Java.我想知道如何在bytebuffer中找到一个字符串,在java中有类似memchr的东西吗?bytebuffer只是部分字符串,其余是原始字节,因此任何java方法都必须处理字节+字符.
我也在搜索java中的strsep以分割字符串.
我需要从存储在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我似乎无法正确解释.
我对位移或屏蔽感到有些困惑,我认为我需要执行它,任何建议都会非常有用.
非常感谢!!
我必须写一个文件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) 我正在尝试将字节数据写入文件并进行优化,我希望减少写入文件的次数.
目前,我正在使用:
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.
嗨,我有2个byteBuffers,我想将它们连接到一个byteBuffer.我在这里找到了一个类似的问题,但没有一个建议对我有用.
我以为,我了解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的位置)。
请帮助我理解这条线,或者如果我的理解存在差距
我有相当大的DirectByteBuffer,我想DirectByteBuffer从它生成一个gzip 而不将其内容传输到堆.
标准java.util.Deflater没有用,因为它按照byte[]定义在堆上运行.
有没有办法在Java中这样做?或者我必须libzip直接打电话JNI?
bytebuffer ×10
java ×10
nio ×3
byte ×2
jvm ×2
bit-shift ×1
bytearray ×1
endianness ×1
gzip ×1
inputstream ×1
io ×1
mask ×1
signed ×1
string ×1
unsigned ×1