Linux中的ascii代码

时间:2011-12-28 22:37:12

标签: java linux ascii

为什么 CTRL + M 给出的ASCII值为10(十进制值)。它实际应该给13.我通过putty连接到Amazon EC2 linux实例。我执行以下程序

import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;

public class NumbersConsole {

private static String ttyConfig;

public static void main(String[] args) {

        try {
                setTerminalToCBreak();

                int i=0;
                while (true) {

                        //System.out.println( ""+ i++ );

                        if ( System.in.available() != 0 ) {
                                int c = System.in.read();
                    System.out.println(c);
                                if ( c == 13 ) {
                                        break;
                                }
                        }

                } // end while
        }
        catch (IOException e) {
                System.err.println("IOException");
        }
        catch (InterruptedException e) {
                System.err.println("InterruptedException");
        }
        finally {
            try {
                stty( ttyConfig.trim() );
             }
             catch (Exception e) {
                 System.err.println("Exception restoring tty config");
             }
        }

}

private static void setTerminalToCBreak() throws IOException, InterruptedException {

    ttyConfig = stty("-g");

    // set the console to be character-buffered instead of line-buffered
    stty("-icanon min 1");

    // disable character echoing
    stty("-echo");
}

/**
 *  Execute the stty command with the specified arguments
 *  against the current active terminal.
 */
private static String stty(final String args)
                throws IOException, InterruptedException {
    String cmd = "stty " + args + " < /dev/tty";

    return exec(new String[] {
                "sh",
                "-c",
                cmd
            });
}

/**
 *  Execute the specified command and return the output
 *  (both stdout and stderr).
 */
private static String exec(final String[] cmd)
                throws IOException, InterruptedException {
    ByteArrayOutputStream bout = new ByteArrayOutputStream();

    Process p = Runtime.getRuntime().exec(cmd);
    int c;
    InputStream in = p.getInputStream();

    while ((c = in.read()) != -1) {
        bout.write(c);
    }

    in = p.getErrorStream();

    while ((c = in.read()) != -1) {
        bout.write(c);
    }

    p.waitFor();

    String result = new String(bout.toByteArray());
    return result;
}

}

当我输入为( CTRL + M )时,我显示的值为10.但我期望值为13.请让我知道如果我错过任何东西吗?

2 个答案:

答案 0 :(得分:3)

CR到LF的转换由tty驱动程序处理。你正在调用setTerminalToCBreak(),它操纵tty设置(我认为它会禁用erase,kill,werase和rprnt特殊字符)。

默认情况下启用的icrnl设置会导致回车符(CR)转换为换行符(LF)。禁用它应该让您直接看到CR字符。设置raw模式会更改许多标记,包括关闭icrnl。 (弄清楚如何在Java中这样做是留下的练习。)

但要注意这样做。 Enter Return 键通常发送CR字符。将其转换为LF是允许它标记线的末尾的原因。如果您关闭该翻译,除非您自己处理CR,否则可能会破坏该行为。

有关tty设置的更多信息,请man tty或关注this link

答案 1 :(得分:0)

我的另一个答案始于错误的页面。

  stty ("-cooked")

适合我。

电传式土地深处的某些东西要求你拥有快乐的小^J而不是^M s,但烹饪终端会阻止它。

       $ stty -cooked ; java -cp /tmp NumbersConsole
       13

       $

回到Good Ol'时代,一些电脑(Commodore,Apple)使用^ M(13)作为返回键;一些(IBM)使用组合^ M ^ J;其他人(Unix)使用^ J(10)。

现在,在现代世界中,它几乎总是^ J(虽然我认为Windows代码有时仍然会有一些遗留的^ M ^ J内容?)