2017-07-29 14 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並使用它們來操縱單個位。