转换整数时出现问题->;ascii->;Java中的int

转换整数时出现问题->;ascii->;Java中的int,java,int,ascii,Java,Int,Ascii,我编写这些函数是为了使用尽可能少的字节数将int值写入文件。但有一行由于某种原因读取了错误的值(参见注释) 文件f=新文件(“data.txt”); RandomAccessFile raf=新的RandomAccessFile(f,“rw”); raf.writeBytes(toByte(4321,3));//将4321转换为ascii raf.seek(0); System.out.println(fromByte(raf.readLine());//折回 //将i

我编写这些函数是为了使用尽可能少的字节数将int值写入文件。但有一行由于某种原因读取了错误的值(参见注释)


文件f=新文件(“data.txt”);
RandomAccessFile raf=新的RandomAccessFile(f,“rw”);
raf.writeBytes(toByte(4321,3));//将4321转换为ascii
raf.seek(0);
System.out.println(fromByte(raf.readLine());//折回
//将i<16777216的整数转换为ascii字符串

//设b=1表示它发生的原因是您将文件读取为UTF。在问题中添加读/写代码。Java字符串的单个字符是UTF-16代码单元(16位整数)。如果任何ASCII字符的值大于127,这会导致转换行为异常。此外,新字符串可能会将其字节数组参数解释为UTF-8(或UTF-16,但很可能不是ASCII)@Michael有办法指定8位字符吗?我假设将无符号8位值强制转换为字符将使用ascii,并且我尝试了
x=(x
char
在Java中是16位长的。这里应该使用
byte
。这是因为您将文件读取为UTF。将读/写代码添加到问题中。Java字符串的各个字符是UTF-16代码单位(16位整数)。如果任何ASCII字符的值大于127,这会使转换行为异常。此外,新字符串可能会将其字节数组参数解释为UTF-8(或UTF-16,但很可能不是ASCII)@Michael有办法指定8位字符吗?我假设将无符号8位值强制转换为字符将使用ASCII,我尝试了
x=(x
char
在Java中是16位长。您应该在这里使用
byte

File f = new File("data.txt");
RandomAccessFile raf = new RandomAccessFile(f, "rw");

raf.writeBytes(toByte(4321,3)); // convert 4321 to ascii
raf.seek(0);
System.out.println(fromByte(raf.readLine())); // convert back

// convert integer to ascii String for i < 16,777,216
// let b=1 for i<256, b=2 for i<256*256, b=3 for i<256*256*256
private static String toByte(int i, int b){
    if (b==3) // 3 bytes
        return "" + (char)(i/65536) + (char)(i%65536/256) + (char)(i%256);
    if (b==2) // 2 bytes
        return "" + (char)(i/256) + (char)(i%256);
    else      // 1 byte
        return "" + (char)i;
}

// convert ascii string to integer for s.length = {1,2,3} 
private static int fromByte(String s){
    int i = 0;
    if (s.length()==3)
        i = (int)s.charAt(0)*65536 + 
            (int)s.charAt(1)*256 + 
            (int)s.charAt(2);//------------> 65533? should be 225!
    else if (s.length()==2)
        i = (int)s.charAt(0)*256 + 
            (int)s.charAt(1);
    else
        i = (int)s.charAt(0);
    return i;
}