Java无法读取写入标准输出的已签名负字节

Java无法读取写入标准输出的已签名负字节,java,powershell,pipe,byte,Java,Powershell,Pipe,Byte,我有两个类,第一个类将1和0的二进制字符串输入到标准输入,并将字符串拆分为长度为8的子字符串以转换为字节,然后写入标准输出,如下所示: byte b = (byte)Integer.parseInt(byteString, 2); System.out.write(b); System.out.flush(); 第二个通过管道传输第一个的输出,最终将字节转换回长二进制字符串,但目前我让它只是这样做: int next; while((next = System.in.read())!=

我有两个类,第一个类将1和0的二进制字符串输入到标准输入,并将字符串拆分为长度为8的子字符串以转换为字节,然后写入标准输出,如下所示:

byte b = (byte)Integer.parseInt(byteString, 2);
System.out.write(b);
System.out.flush();
第二个通过管道传输第一个的输出,最终将字节转换回长二进制字符串,但目前我让它只是这样做:

int next;
    while((next = System.in.read())!=-1){
    System.out.print(next); System.out.print(" ");
    System.out.flush();
}
如果我替换
System.out.write(b)
系统输出打印(b);系统输出打印(“”)
在具有一些小样本输入的第一个类中,输出是
-80-84 83 11 98-116 53-119 49 27 10-80-72 104-123 0

如果我将此输出传输到第二个类,它将输出
63 63 83 11 98 63 53 63 49 27 13 10 63 104 63 0 13 10

有两件事似乎正在发生,我不明白为什么,
System.in.read()
正在返回
63
,这是在读取将被签名为负数的字节时的ASCII码?
,并且在末尾添加了回车+新行。我被难倒的解决方案,洞察是非常感谢


注意:我是在Windows10PowerShell中运行这个程序的,但是在普通的命令行和linux终端上,这个行为和预期的一样,所以问题只出现在powershell中

我不使用powershell,但一个小测试表明管道确实会更改输出,比如在末尾添加换行符和回车符,或者将字节0xA2转换为0x3f(“?”)

搜索我找到的网。我只读了第一段,但其中包含一个提示:

管道在Windows PowerShell中几乎无处不在。尽管您可以在屏幕上看到文本,但Windows PowerShell不会在命令之间传输文本。相反,它将管道对象。


这可能会有所帮助:

我不使用powershell,但一个小测试表明管道确实会更改输出,比如在末尾添加换行符和回车符,或者将字节0xA2转换为0x3f(“?”)

搜索我找到的网。我只读了第一段,但其中包含一个提示:

管道在Windows PowerShell中几乎无处不在。尽管您可以在屏幕上看到文本,但Windows PowerShell不会在命令之间传输文本。相反,它将管道对象。

也许这有助于:

字节是用Java签名的,InputStream.read()的结果也是用Java签名的。试试这个:

int next;
DataInputStream in = new DataInputStream(System.in);
for (;;)
{
    try
    {
        next = in.readUnsignedByte();
        System.out.print(next); System.out.print(" ");
        System.out.flush();
    }
    catch (EOFException exc)
    {
        break;
    }
}
字节是用Java签名的,InputStream.read()的结果也是用Java签名的。试试这个:

int next;
DataInputStream in = new DataInputStream(System.in);
for (;;)
{
    try
    {
        next = in.readUnsignedByte();
        System.out.print(next); System.out.print(" ");
        System.out.flush();
    }
    catch (EOFException exc)
    {
        break;
    }
}

Java
System.in.read()
读取原始二进制文件。字节,而不是ASCII字符串,这是您正在打印的内容。请尝试在某种读取器中包装System.in。我在Windows 10 powershell中运行此程序,但在正常的命令行和linux终端上,其行为与预期一致,因此问题仅出现在powershell中,但仍不确定why@ogilberry这些信息应该是问题的一部分,而不仅仅是评论。。。可能添加powershell标记也有助于SAVA
System.in.read()
读取原始二进制文件。字节,而不是ASCII字符串,这是您正在打印的内容。请尝试在某种读取器中包装System.in。我在Windows 10 powershell中运行此程序,但在正常的命令行和linux终端上,其行为与预期一致,因此问题仅出现在powershell中,但仍不确定why@ogilberry这些信息应该是问题的一部分,而不仅仅是评论。。。也许添加powershell标记也有助于我相信
InputStream.read()
的结果是一个
int
,并且总是非负或-1(EOF),javadoc:“…值字节作为int返回,范围在0到255之间…”,问题是没有显示正在读取的任何负数(“63 63 83 11 98 63 53 63 49 27 13 10 63 104 63 0 13 10”),它在正常的命令行或linux shell上工作,只是不在powershell中(请参阅问题注释)-上面的代码应该给出与问题相同的结果…(可以/将返回负字节的是
read(byte[])
)刚刚测试了您的代码,它与问题代码具有相同的行为!我相信
InputStream.read()
的结果是
int
,并且总是非负或-1(EOF),javadoc:“…值字节作为int返回,范围为0到255。。。“,问题没有显示正在读取的任何负数(“63 63 83 11 98 63 53 63 63 49 27 13 10 63 104 63 0 13 10”),它在正常的命令行或linux shell上工作,只是不在powershell中(请参阅问题注释)-上面的代码应该给出与问题相同的结果…(它是
读取(字节[])
可以/将返回负字节)刚刚测试了您的代码,它与问题代码具有相同的行为!