我知道使用十六进制编辑器,可以编辑二进制文件并使用每个十六进制值更改4位,但我想到的是一个需要修改单个位而不是4位的项目。
那么有没有办法以比特读取某些内容(例如ASCII编码的纯文本文件)并操纵例如单个比特。爪哇?
作为一个菜鸟,我可以考虑加载每个字节并生成一个包含每个字节的每个8位表示的字符串,但这是一种非常复杂的方式并且会浪费大量空间。此外,这种方法需要我保留一个包含每个可用字节的8位表示的列表来查找它。
答案 0 :(得分:0)
其他人已经暗示您的问题很广泛,其他网站,资源或搜索可能会更好地回答。
但是,我想向您展示一些可以启动的小片段。
// Read a file into a byte array, we are not interested
// in interpreting encodings, just plain bytes
final byte[] fileContent = Files.readAllBytes(Paths.get("pathToMyFile"));
// Iterate the content and display one byte per line
for (final byte data : fileContent) {
// Convert to a regular 8-bit representation
System.out.println(Integer.toBinaryString(data & 255 | 256).substring(1));
}
您还可以通过简单地访问数组内容并使用&
,|
,^
这样的简单位运算符来轻松操作字节和位。
这是一个片段,向您展示如何在给定位置设置和取消设置位:
byte data = ...;
// Set it (to 1)
data = data | (1 << pos);
// Unset it (to 0)
data = data & ~(1 << pos);
转换在此解释:how to get the binary values of the bytes stored in byte array
这里的位操作:Set specific bit in byte
以下是一些相关的Java文档:Files#readAllBytes和Integer#toBinaryString
请注意,从效率的角度来看,Java中最小的是byte
,没有bit
数据类型。但是在实践中你可能看不出任何差别,CPU已经将整个相邻的位和字节加载到缓存中,无论你是否想要使用它们。因此,您可以使用byte
数据类型并使用它们来操作单个位。