这是ASCII类型吗?

时间:2014-03-18 12:49:58

标签: java serial-port char ascii inputstream

enter image description here

这是ASCII吗?

如何在理解语言中打印它?比如在char?

我从PortCom得到了这个答案。 我的阅读方式如下:

boolean ok = false;
int read = 0;
System.out.println("In Read :");
  while(ok == false) {
    int availableBytes = 0;
    try {
        availableBytes = inputStream.available();
        if (availableBytes > 0) {
            read = read + availableBytes;
            int raw = inputStream.read(readBuffer, read-availableBytes, availableBytes);
            System.out.println("Inpustream ="+raw);
            traduction = new String(readBuffer, read-availableBytes, availableBytes);
            System.out.println("2=>" + traduction);
            Response = new String(readBuffer, "UTF-8");             // bytes -> String
        } catch (IOException e) {
    }
    if (availableBytes == 0 && (read == 19 || read == 8)){
        ok = true;
    }
}

2 个答案:

答案 0 :(得分:2)

在我阅读您的评论时,我的印象是您对字符和ASCII的含义感到有些困惑。

字符是数字。简单的愚蠢数字。事实上,人们在数字和字母之间创建了标准映射。例如,根据ASCII字符 map ,97是a。这样做的含义是,当显示软件看到97时,它知道它必须找到给定字体中的字符a的字形,并将其绘制到屏幕上。

当使用ASCII字符映射解释时,整数值0到31是所谓的控制字符,因此没有与之关联的可视字形。它们告诉软件如何表现而不是显示什么。例如,字符#0是NUL字符,用于表示带有C字符串库的字符串的结尾,在大多数其他语言中几乎没有实际用途。在我的脑海中,角色#13是NL,对于"新线",它告诉渲染软件将绘图光标移动到下一行,而不是渲染角色。

大多数ASCII控制字符已过时,并不打算发送到文本渲染软件。因此,如果实施人员不知道该怎么做,他们会决定如何处理这些问题。他们中的许多人什么都不做,有些打印问号,有些打印完全不相关的字符。

ASCII仅将0到128之间的整数映射到字形或控制字符,这会在未定义的字节中留下另外128个可能的整数。高于127的整数在ASCII标准中没有关联的字形,只有这些字符可以被称为"而不是ASCII"。那么,你应该问的是,"是文本?"而不是"是 ASCII ?",因为0到127之间的任何整数序列都必须是ASCII,但是它不管是否是人类 - 可读的。

这个问题的明显答案是"不,它不是文字"。如果它不是文本,那么问我们是什么样的心理学,因为那里没有通用的错误" maims文本。它几乎可以是任何东西。

但是,由于您声明您正在阅读串行链接,我建议您检查一下波特率和其他链接设置,因为没有内置的机制可以检测从最终到另一端的不匹配,它可以像在这里一样破坏数据。

答案 1 :(得分:0)

使用原始值代替availableBytes:

traduction = new String(readBuffer, read-availableBytes, raw);

原始表示实际读取的数量与您请求的数量相对应。如果您询问10个字节并且它读取5,则剩余的5个将是未知的垃圾。

<强>更新

由于同样的原因,答案显然也是错误的:

Response = new String(readBuffer, "UTF-8");

即使你只读了1个字节,你也要告诉它转换整个缓冲区。如果您有点不走运,您将获得异常,因为并非所有字节组合都可以使用UTF-8进行转换