有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过网络写入4字节的无符号整数

我在用java编写无符号4字节整数时遇到问题

在64位MacOS和32位Linux(Ubuntu)上,用java编写长值会产生不同的结果 或 向网络写入4字节无符号int有问题

下面的调用在我的本地OSX上非常有效

writeUInt32(999999,outputstream)

把它读回给我999999

但是,当应用程序部署到网络时,写入一个长值会导致其他一些随机数(我假设endian已被切换?)阅读它给了我一些其他的大数字

------完整的方法堆栈如下所示---------------

public void writeUInt32(long uint32,DataOutputStream stream) throws IOException {
        writeUInt16((int) (uint32 & 0xffff0000) >> 16,stream);
        writeUInt16((int) uint32 & 0x0000ffff,stream);
    }

public void writeUInt16(int uint16,DataOutputStream stream) throws IOException {
        writeUInt8(uint16 >> 8, stream);
        writeUInt8(uint16, stream);
    }

public void writeUInt8(int uint8,DataOutputStream stream) throws IOException {
        stream.write(uint8 & 0xFF);
    }

编辑:添加到一个文件,然后通过网络传输给我发送正确的值混淆!因此,当outputstream指向本地文件时,它会写入正确的值,但当outputstream指向ByteArrayOutputStream时,写入的长值是错误的


共 (1) 个答案

  1. # 1 楼答案

    只需使用DataOutput/InputStream

    要编写,请将long强制转换为int

    public void writeUInt32(
          long uint32,
          DataOutputStream stream
        ) throws IOException
    {
        stream.writeInt( (int) uint32 );
    }
    

    读取时,使用readInt,分配给long并屏蔽前32位以获得无符号值

    public long readUInt32(
          DataInputStream stream
        ) throws IOException
    {
        long retVal = stream.readInt( );
    
        return retVal & 0x00000000FFFFFFFFL;
    }
    

    编辑

    从您的问题来看,您似乎对基本类型的Java强制转换和升级感到困惑

    阅读Java规范关于转换和升级的这一节:http://java.sun.com/docs/books/jls/third_edition/html/conversions.html