使用 ByteBuffer 处理 byte[]

发布于 2024-10-12 02:19:26 字数 733 浏览 1 评论 0原文

我尝试通过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野稚 2024-10-19 02:19:26

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

已编辑:根据OP评论。

例如:

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 将被定位到下一个位置。希望这就是您正在寻找的。

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:

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);

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.

随风而去 2024-10-19 02:19:26

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

Are you aware that in Java a char occupies two bytes?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文