我知道使用十六进制编辑器,可以编辑二进制文件并用每个十六进制值更改4位,但我想到的项目需要修改单比特而不是4比特。以位表示方式打开文件并在Java中操作位
那么,有没有办法读取位的东西(例如ASCII编码的纯文本文件),并操纵例如单位Java的?
作为一个小白,我能想到的每一个加载字节数和生成包含每个字节的每8位表示一个字符串的,但是这是一种非常复杂的方式会浪费大量的空间。此外,这种方法需要我保留一个包含每个可用字节的8位表示的列表来查找它。
我知道使用十六进制编辑器,可以编辑二进制文件并用每个十六进制值更改4位,但我想到的项目需要修改单比特而不是4比特。以位表示方式打开文件并在Java中操作位
那么,有没有办法读取位的东西(例如ASCII编码的纯文本文件),并操纵例如单位Java的?
作为一个小白,我能想到的每一个加载字节数和生成包含每个字节的每8位表示一个字符串的,但是这是一种非常复杂的方式会浪费大量的空间。此外,这种方法需要我保留一个包含每个可用字节的8位表示的列表来查找它。
其他人已经暗示,你的问题很广,很可能通过其他网站,ressources或搜索得到更好的回答。
但是,我想告诉你一些小片段,你可以从中开始。
// 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
并使用它们来操纵单个位。
#2是不是一个伟大的地方要问,可以轻松和更好的通过异地资源和教程回答广泛的问题。在你的情况下,简单地搜索“在Java中的位操作”和“在Python中的位操作”可能会让你更好,更完整的答案。 –
https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own –
此外,“位”与“十六进制”与“字节”是字面上不同的方式来查看数据,而不是因素成字面上的任何东西,除了读给人类有多难。 –