ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 通过网络编写4字节的unsigned int

2019-08-26 19:14:14  阅读:247  来源: 互联网

标签:java long-integer unsigned casting networking


我在java中编写无符号4字节int时遇到问题.

在java中写一个long值在64位MacOS和32位Linux(Ubuntu)上有不同的结果
要么
写入网络4字节unsigned int有一个问题.

以下调用在我的本地OSX上完美运行

writeUInt32(999999,outputstream)

读回来给我999999

但是,当应用程序部署到网络时,写入一个长值会产生一些其他随机数(我假设字节序已被切换?)并且读取它会给我一些其他大数字.

———-完整的方法堆栈如下—————

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);
    }

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

解决方法:

只需使用DataOutput / InputStream.

写,把你的长期投入到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

标签:java,long-integer,unsigned,casting,networking
来源: https://codeday.me/bug/20190826/1732989.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有