Java Socket与C# TcpClient的区别

3

我正在将一个Java应用程序转换为C#,并且我有一个关于底层字节流的一般性问题。

在C#中,“byte”是无符号的,而在Java中则是有符号的。

这对我在比较字节等价性时的代码部分会产生什么影响呢?例如:

Java 代码

public final static byte IAC = (byte)255;
...
void parseBuffer(byte[] bb, int len) {
    try {
        for(int i = 0;i < len; i++) {
            if(bb[i] == IAC)
                DoSomething();
        }
    }
}

我需要对IAC变量的声明做什么吗?它会是除(byte)255之外的其他内容吗?

提前感谢您的帮助。

1个回答

1

我需要对IAC变量的声明做些什么吗?

不需要。没问题的。你最终会得到一个值为-1的IAC,但这是可以接受的,仍然代表所有位设置的字节。如果你从C#端发送值为255的字节,则在Java端可以正确接收。

另一种选择是使用更大的数据类型(例如方便起见的int),并使用位掩码来获得范围在[0,255]内的值:

public static final int IAC = 255;
...
void parseBuffer(byte[] bb, int len) {
    try {
        for(int i = 0; i < len; i++) {
            int value = bb[i] & 0xff; // To get a value in the range [0, 255]
            if (value == IAC) {
                DoSomething();
            }
        }
    }
}

谢谢Jon。快速跟进您的回复。您的意思是说,当从TcpClient读取字节流时,它将读取无符号字节值,因此将其与其他无符号字节进行比较(例如我的IAC声明)是可以的,并且在语义上与Java版本相同? - user1137939
@user1137939:字节只是字节-8位值。在C#中,所有8位设置为1的byte值具有数值255,而在Java中它具有数值-1。这很不幸(你几乎从不想把字节视为有符号值),但你应该没问题。只需尝试将它们视为8位的集合而不是数字-这会让你的生活更轻松 :) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接