用 ByteBuffer 处理 byte[]

Posted

技术标签:

【中文标题】用 ByteBuffer 处理 byte[]【英文标题】:Handle byte[] with ByteBuffer 【发布时间】:2011-01-13 21:07:43 【问题描述】:

我尝试通过 ByteBuffer 访问 byte[] 以表示我定义的文件类型。 byte[] 中的第一个位置包含一些元数据并使用位操作进行处理。所以它们根本不代表字符。

我想在某个固定位置添加文件数据(例如字符)。

byte[] file_portion 包含一个大文件的一部分:开始部分。其中包括带有元数据的标头。 content 是一个字符串,其中包含我要添加到该缓冲区的信息。 start_pos 是从内容中保存新文件数据的第一个位置。

ByteBuffer my_content = ByteBuffer.allocate(this.file_portion.length);
content_buffer.wrap(this.file_portion);

for (int i = 0; i < content.length(); i++) 
    char tmp = content.toCharArray()[i];
    my_content.put(this.start_pos + i, (byte) tmp)

如果我重新映射这个,我会得到一个垃圾和空虚:

CharBuffer debug = my_content.asCharBuffer();
System.out.println("debug " + debug);

如果第一个位置显示损坏的字符,我可以理解...但没有一个位置是正确的。

【问题讨论】:

除了错误,content.toCharArray()[i] 很丑,你在每次循环迭代中分配一个新的 char 数组。在外面构建char数组,或者使用content.charAt(i) 【参考方案1】:

如果您将字符添加到 ByteBuffer 并希望它们可以通过 CharBuffer 视图读取,则应该使用 putChar(...) 而不是 put(...)。

已编辑:每个 OP cmets。

例如:

char[] chars = content.toCharArray();  // removed from loop per leonbloy's excellent comment  
CharBuffer cbuf = my_content.asCharBuffer();

for (int i = 0; i < content.length(); i++) 
    cbuf.putChar(chars[i]);


CharBuffer debug = my_content.asCharBuffer();
System.out.println(debug);

my_content.position(my_content.position() + 2*chars.length);

否则 CharBuffer 会将您的两个连续字节作为单个字符读取。 现在 cbuf 缓冲区将在您的字节缓冲区停止的同一点开始加载字符。加载所有字符后,您的原始 ByteBuffer 将被定位到下一个位置。希望这就是您正在寻找的。​​p>

【讨论】:

那个 .flip() 看起来很有用。但我仍然必须在特定位置添加字符。如果我用 my_content.setPosition(this.start_pos+i) 甚至 + i +1 这样做,整个转换就会被破坏。 我想我想说的是,你需要让缓冲区为你做两件事,让你的生活更轻松。 1) 管理缓冲区中的位置和 2) 管理正在读/写的项目的数据格式。在您的原始代码中,您尝试同时执行这两种操作,并因此遇到问题。 非常感谢您的努力。你是绝对正确的:在这里管理职位是有问题的,我必须把它分开。我仍然有从位置 0 填充 cbuf 的问题。我需要从位置 n 开始填充它。每次我这样做时,整个东西都会被破坏。 :( @wishi 我想我需要更多地了解您正在做的事情的上下文,以提出解决您问题的代码。 终于明白了...感谢您的帮助。 CharBuffer 有我需要的 .put(index, char) 。非常感谢!!【参考方案2】:

你知道在 Java 中一个 char 占用两个字节吗?

【讨论】:

以上是关于用 ByteBuffer 处理 byte[]的主要内容,如果未能解决你的问题,请参考以下文章

浅谈ByteBuffer转换成byte[]时遇到的问题

byte转bit

从 ByteBuffer 获取到 byte[] 不写入到 byte[]

java 中 byte[]FileInputStream 互相转换

java 中 byte[]FileInputStream 互相转换

java 中 byte[]FileInputStream 互相转换