我知道使用十六進制編輯器,可以編輯二進制文件並用每個十六進制值更改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 –
此外,「位」與「十六進制」與「字節」是字面上不同的方式來查看數據,而不是因素成字面上的任何東西,除了讀給人類有多難。 –