使用 ByteBuffer 处理 byte[]
我尝试通过 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);
我可以理解第一个位置是否显示损坏的字符......但没有一个位置是正确的。
I try to access a byte[] via a ByteBuffer in order to represent a file-type I defined. The first positions within the byte[] contain some Metadata and get treated with bit-manipulations. So they do not represent a char at all.
I want to add file-data (chars e. g.) at a certain fixed position.
byte[] file_portion
contains a portion of a large file: the beginning section. Which includes the header with the Metadata.content
is a String with information I want to add to that buffer. start_pos is the first position to hold the new file-data from content.
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)
}
If I remap this I get a garbage and emptyness:
CharBuffer debug = my_content.asCharBuffer();
System.out.println("debug " + debug);
I could understand if the first positions show corrupted chars... but not a single one position is correct.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果要将字符添加到 ByteBuffer 并期望它们可以通过 CharBuffer 视图读取,则应该使用 putChar(...) 而不是 put(...)。
已编辑:根据OP评论。
例如:
否则 CharBuffer 将读取两个连续字节作为单个字符。
现在,cbuf 缓冲区将在字节缓冲区停止的同一点开始加载字符。加载所有字符后,原始 ByteBuffer 将被定位到下一个位置。希望这就是您正在寻找的。
If you are adding chars to a ByteBuffer and expecting them to be readable with a CharBuffer view, you should be using putChar(...) not put(...).
EDITED: per OP comments.
For example:
Otherwise the CharBuffer is reading two of your consecutive bytes as a single char.
Now the cbuf buffer will start loading chars at the same point your byte buffer left off. After loading all of the chars, your original ByteBuffer will be positioned to the next location. Hopefully this is what you're looking for.
你知道在Java中一个char占用两个字节吗?
Are you aware that in Java a char occupies two bytes?