【问题标题】:Java Socket vs. C# TcpClientJava Socket 与 C# TcpClient
【发布时间】:2024-10-03 11:05:01
【问题描述】:

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

一个“字节”在 C# 中是无符号的,而在 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 以外的任何东西?

提前感谢您的帮助。

【问题讨论】:

    标签: c# java sockets tcpclient


    【解决方案1】:

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

    没有。绝对没问题。对于 IAC,您最终会得到 -1 的值,但这很好,仍然代表一个所有位都已设置的字节。如果你从 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();
                }
            }
        }
    }
    

    【讨论】:

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