2017-07-29 12 views
1

我知道使用十六进制编辑器,可以编辑二进制文件并用每个十六进制值更改4位,但我想到的项目需要修改单比特而不是4比特。以位表示方式打开文件并在Java中操作位

那么,有没有办法读取位的东西(例如ASCII编码的纯文本文件),并操纵例如单位Java的?

作为一个小白,我能想到的每一个加载字节数和生成包含每个字节的每8位表示一个字符串的,但是这是一种非常复杂的方式会浪费大量的空间。此外,这种方法需要我保留一个包含每个可用字节的8位表示的列表来查找它。

+1

#2是不是一个伟大的地方要问,可以轻松和更好的通过异地资源和教程回答广泛的问题。在你的情况下,简单地搜索“在Java中的位操作”和“在Python中的位操作”可能会让你更好,更完整的答案。 –

+0

https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own –

+0

此外,“位”与“十六进制”与“字节”是字面上不同的方式来查看数据,而不是因素成字面上的任何东西,除了读给人类有多难。 –

回答

0

其他人已经暗示,你的问题很广,很可能通过其他网站,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#readAllBytesInteger#toBinaryString


请注意,从效率的角度来看,你可以在Java中最小的是byte,没有bit数据类型。然而在实践中你可能看不出任何区别,CPU已经将整个相邻位和字节加载到缓存中,无论你是否想使用它们。因此,您可以使用数据类型byte并使用它们来操纵单个位。