我正在研究一种压缩算法,为此我需要将字符串写入二进制文件并再次检索到与String完全相同的内容! 比方说,我有一个字符串" 10100100100 ....."我会把它们写成一个文件作为位
(不是chars' 0'' 1')
。并作为位读回并转换为字符串... 这适用于大量数据(> 100兆字节)。 这样做有什么简洁快捷的方法吗?
到目前为止,我尝试(并且失败)通过子串到8位然后作为ASCII字符到字符串,最后到.txt文件将它们写入字节。
{
String Bits="10001010100000000000"; // a lot larger in actual program
String nCoded="";
char nextChar;
int i = 0;
for(i=0; i < Bits.length()-8; i += 8){
nextChar = (char)Integer.parseInt( Bits.substring(i, i+8), 2 );
nCoded += nextChar;
}
// for the remainding bits, padding
if(newBits.length()%8 != 0){
nCoded+=(char)Integer.parseInt(Bits.substring(i), 2);
}
nCoded+=(char)Bits.length()%8; //to track the remainder of Bits that was padded
writeToTextFile( nCoded, "file.txt"); //write the nCoded string to file
}
但这似乎破坏了信息并且效率低下。 再次澄清一下,我不想写 String ,它只是实际数据的表示。所以,我想
将字符串表示形式的每个0和1转换为二进制形式 并将其写入档案。
答案 0 :(得分:0)
这是一个方法,您可以使用该方法将String转换为一系列位,准备输出到文件:
private byte[] toByteArray(String input){
//to charArray
char[] preBitChars = input.toCharArray();
int bitShortage = (8 - (preBitChars.length%8));
char[] bitChars = new char[preBitChars.length + bitShortage];
System.arraycopy(preBitChars, 0, bitChars, 0, preBitChars.length);
for (int i= 0; i < bitShortage; i++) {
bitChars[preBitChars.length + i]='0';
}
//to bytearray
byte[] byteArray = new byte[bitChars.length/8];
for(int i=0; i<bitChars.length; i++) {
if (bitChars[i]=='1'){
byteArray[byteArray.length - (i/8) - 1] |= 1<<(i%8);
}
}
return byteArray;
}
传递字符串&#34; 01010101&#34;将结果[85]作为字节[]返回。
事实证明,有一种更简单的方法。有一个返回Byte.parseByte(String)
对象的静态Byte
。主叫:
Byte aByte = Byte.parseByte("01010101");
System.out.println(aByte);
显示相同的值:85。
所以你可以在这里问几个问题。
Byte.parseByte()
的文件应该是:ASCII减号&#39; - &#39; (&#39; \ u002D&#39;)表示负值或ASCII加号&#39; +&#39; (&#39; \ u002B&#39;)表示正值。
因此,根据这些信息,您需要手动将String拆分为8位字符串,并调用Byte.parseByte()
为每个字符串获取Byte
个对象。
2)如何将位写入文件?不,文件写入以字节为单位完成。如果您需要编写该文件,然后将其读回并转换回String,则需要反转该过程并以byte[]
的形式读取该文件,然后将其转换为它的字符串表示形式
有关如何将字节转换为精美字符串格式的提示,请访问:
Convert byte (java data type) value to bits (a string containing only 8 bits)