当前位置: 首页 > 知识库问答 >
问题:

如何避免缓冲区溢出异常?

仉梓
2023-03-14

我正在尝试正确地使用ByteBuffer和BigEndian字节顺序格式。。

我有几个字段,我试图把它存储在Cassandra数据库之前放在一个单一的ByteBuffer中。

我将要写入Cassandra的字节数组由三个字节数组组成,如下所述-

short employeeId = 32767;
long lastModifiedDate = "1379811105109L";
byte[] attributeValue = os.toByteArray();

现在,我需要快速压缩attributeValue数据,然后再将其存储在Cassandra中-

employeeId (do not snappy compressed)
lastModifiedDate (do not snappy compressed)
attributeValue  (snappy compressed it)

现在,我将编写employeeIdlastModifiedDate和snappy压缩的attributeValue一起组成一个单字节数组,生成的字节数组我将写入Cassandra,然后让我的C程序从Cassandra检索字节数组数据,然后反序列化以提取employeeIdlastModifiedDate并使用snappy从中解压缩此attributeValue

为了做到这一点,我使用了ByteBuffer和BigEndian字节顺序格式。

我把这些代码放在一起-

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

        String text = "Byte Buffer Test";
        byte[] attributeValue = text.getBytes();

        long lastModifiedDate = 1289811105109L;
        short employeeId = 32767;

        // snappy compressing it and this line gives BufferOverflowException
        byte[] compressed = Snappy.compress(attributeValue);

        int size = 2 + 8 + 4 + attributeValue.length; // short is 2 bytes, long 8 and int 4

        ByteBuffer bbuf = ByteBuffer.allocate(size); 

        bbuf.order(ByteOrder.BIG_ENDIAN);
        bbuf.putShort(employeeId);
        bbuf.putLong(lastModifiedDate);
        bbuf.putInt(attributeValue.length);
        bbuf.put(compressed); // storing the snappy compressed data

        bbuf.rewind();

        // best approach is copy the internal buffer
        byte[] bytesToStore = new byte[size];
        bbuf.get(bytesToStore);

        // write bytesToStore in Cassandra...

        // Now retrieve the Byte Array data from Cassandra and deserialize it...
        byte[] allWrittenBytesTest = bytesToStore;//magicFunctionToRetrieveDataFromCassandra();

        // I am not sure whether the below read code will work fine or not..
        ByteBuffer bb = ByteBuffer.wrap(allWrittenBytesTest);

        bb.order(ByteOrder.BIG_ENDIAN);
        bb.rewind();

        short extractEmployeeId = bb.getShort();
        long extractLastModifiedDate = bb.getLong();
        int extractAttributeValueLength = bb.getInt();
        byte[] extractAttributeValue = new byte[extractAttributeValueLength];

        bb.get(extractAttributeValue); // read attributeValue from the remaining buffer

        System.out.println(extractEmployeeId);
        System.out.println(extractLastModifiedDate);
        System.out.println(new String(Snappy.uncompress(extractAttributeValue)));

}

不知怎的,上面的代码抛出了BufferOverflowException-

Exception in thread "main" java.nio.BufferOverflowExcepthtml" target="_blank">ion
    at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:165)
    at java.nio.ByteBuffer.put(ByteBuffer.java:813)

为什么我要在将数据存储到Cassandra之前对其进行快速压缩,因为当我从C代码中从Cassandra检索数据时,它应该进行快速压缩,以便在C映射中占用更少的空间。只有当人们打电话给我们时,我们才会解压它。

谁能看看,让我知道我在这里做错了什么?我应该如何阅读当时的数据?

共有1个答案

徐君植
2023-03-14

分配原始ByteBuffer时,应该使用压缩的长度。

 类似资料:
  • 缓冲区溢出的漏洞随着冯·诺依曼 1 构架的出 现就已经开始出现了。 在1988年随着莫里斯互联网蠕虫的广泛传播他们开始声名狼藉。不幸的是, 同样的这种攻击一直持续到今天。 到目前为止,大部分的缓冲区溢出的攻击都是基于摧毁栈的方式。 大部分现代计算机系统使用栈来给进程传递参数并且存储局部变量。 栈是一种在进程映象内存的高地址内的后进先出(LIFO)的缓冲区。 当程序调用一个函数时一个新的“栈帧”会被

  • 当程序试图在临时数据存储区域(缓冲区)中存储比预期要容纳的更多数据时,会出现缓冲区溢出。由于创建缓冲区以包含有限数量的数据,因此额外信息可能溢出到相邻缓冲区中,从而破坏其中保存的有效数据。 示例 这是缓冲区溢出的经典示例。它演示了一个简单的缓冲区溢出,它是由第一个依赖外部数据来控制其行为的场景引起的。无法限制用户输入的数据量,程序的行为取决于用户放入的字符数。 动手实践 第1步 - 我们需要使用姓

  • 首先,我要声明,我打的这篇文档,原稿是《黑手缓冲区溢出教程》,而不是作者出的正版书,在这里向王炜老大道歉!!因为我兜里的那个实在是那什么,外加上我们烟台这里买不到…

  • 前言 进程的内存映像 常用寄存器初识 call,ret 指令的作用分析 什么是系统调用 什么是 ELF 文件 程序执行基本过程 Linux 下程序的内存映像 栈在内存中的组织 缓冲区溢出 实例分析:字符串复制 缓冲区溢出后果 缓冲区溢出应对策略 如何保护 ebp 不被修改 如何保护 eip 不被修改? 缓冲区溢出检测 缓冲区注入实例 准备:把 C 语言函数转换为字符串序列 注入:在 C 语言中执行

  • Summary To find out more about buffer overflow vulnerabilities, please go to Buffer Overflow pages. See the OWASP article on Buffer Overflow Attacks. See the OWASP article on Buffer Overflow Vulnerabi

  • GSAIOException:错误代码:393238缓冲区溢出,没有可用空间 但我不知道这意味着什么。谁能解释一下是哪种例外。我可以在哪里搜索代码找到问题?