网络字节顺序 流操作

时间:2022-12-13 23:30:55
以前的一个基于SOCKET的报文传输项目,让我知道了什么叫网络字节顺序。在C函数中,有一系列函数支持,如:htons函数(host to net )见:winsock.h。总的意思是:不同的操作系统对 long , doulbe 等的内码字节顺序存储不一样。因此,一般情况下需要转为统一的网络字节顺序才在网络中传输。如:对两个字节长度的整型,使用java转为网络字节顺序的代码为:

  public static byte[] hexToNet(int i) {
    byte[] bt = new byte[2];
    bt[1] = (byte) (i & 0xFF); // 底8位
    bt[0] = (byte) ( (i >> 8) & 0xFF); // 高8位。
    return bt;
  }
 ---------------------------------

   周二,我们又碰到了基于TUXEDO的CARRY类型的报文传输。其中要把某位字节值填上0x80。我想使用log4j把这值输出到文本文件来查看。于是使用 new String(b)后输出,使用UltraEdit-32 打开这个日志文本文件,查看ASCII码,发现是:0x3f。而不是想要的0x80

----------------------------------

  使用C来写,是对的,代码如下:

// mytest.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

int main(int argc, char* argv[])
{
    FILE *fp = fopen("D://my.txt", "a");
    unsigned short us1 ;
    us1 = (unsigned short)strlen("PLC001") | 0x08000;
    u_short   us = htons(us1);
    printf("(short)strlen(/"PLC001/") | 0x08000 =%d/n",us1);
    fprintf(fp,"%s",&us,sizeof(u_short));
    fclose(fp);
    return 0;
}

 ------------------------------------------------------------------------------

   后来经朋友指点,要使用流来输出,而不是log4j的输出。才解决了这个问题:

      FileOutputStream fos = null;
      File myFile = new File("D://test.txt");
      byte[] b = new byte[1];
      b[0] = (byte)0x80;
      try{
        if (!myFile.exists()) {
          myFile.createNewFile();
        }
        fos = new FileOutputStream(myFile);
        fos.write(b);
      }
      catch (Exception e) {
        e.printStackTrace();
      }

      这时看日志文件,才看到想要看到的结果:0x80
-------------------------------------------------------------------------------

    感悟:对java,对字节流处理的基础功课,还真得补一补!

 今天,分析了一下 TUXEDO的CARRY ,其实也是由 byte[]组成的。因此,在网络传输中,肯定也是以 socket的DataOutputStream之类的来 wrrite(byte[])。