java c 数据转换_Java与C底层数据类型转换

该博客介绍了一种适用于Java与C++通讯的方法,涉及网络流解析和生成,主要讨论了高低位互换(Big-Endian与Little-Endian)的概念,并提供了Java中进行数据类型转换的实用工具类CIOUtil,包括读写布尔、字节、字符、双精度、单精度等数据类型的函数。
摘要由CSDN通过智能技术生成

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

/**

* 仅仅适用于 Java 与 C++ 通讯中,网络流解析与生成使用

*

* 高低位互换(Big-Endian 大头在前 & Little-Endian 小头在前)。

* 举例而言,有一个4字节的数据0x01020304,要存储在内存中或文件中编号 0˜3字节的位置,两种字节序的排列方式分别如下:

*

* Big Endian

*

* 低地址              高地址

* ---------------------------------------------------->

* 地址编号

* |   0   |   1   |   2    |   3  |

* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

* |   01   |   02  |   03   |   04  |

* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

*

* Little Endian

*

* 低地址              高地址

* ---------------------------------------------------->

* 地址编号

* |   0   |   1   |   2    |   3  |

* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

* |   04   |   03  |   02   |   01  |

* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

*

* Java则统一使用big模式

* c中的unsigned short 对应着java中的char两个字节,无符号

* c的无符号int,short,byte字节数组,相应转换成java的long,char,short

*

* @author Snowolf

* @version 1.0

* @since 1.0

*/

public abstract class CIOUtil {

public static final String CHARSET = "UTF-8";

/**

* 从输入流中读布尔

*

* @param is

* @return

* @throws IOException

*/

public static boolean readBoolean(DataInputStream is) throws IOException  {

return is.readBoolean();

}

/**

* 从流中读定长度字节数组

*

* @param is

* @param s

* @return

* @throws IOException

*/

public static byte[] readBytes(DataInputStream is, int i)

throws IOException {

byte[] data = new byte[i];

is.readFully(data);

return data;

}

/**

* 从输入流中读字符

*

* @param is

* @return

* @throws IOException

*/

public static char readChar(DataInputStream is) throws IOException {

return (char) readShort(is);

}

/**

* 从输入流中读双精度

*

* @param is

* @return

* @throws IOException

*/

public static double readDouble(DataInputStream is) throws IOException  {

return Double.longBitsToDouble(readLong(is));

}

/**

* 从输入流中读单精度

*

* @param is

* @return

* @throws IOException

*/

public static float readFloat(DataInputStream is) throws IOException  {

return Float.intBitsToFloat(readInt(is));

}

/**

* 从流中读整型

*

* @param is

* @return

* @throws IOException

*/

public static int readInt(DataInputStream is) throws IOException {

return Integer.reverseBytes(is.readInt());

}

/**

* 从流中读长整型

*

* @param is

* @return

* @throws IOException

*/

public static long readLong(DataInputStream is) throws IOException {

return Long.reverseBytes(is.readLong());

}

/**

* 从流中读短整型

*

* @param is

* @return

* @throws IOException

*/

public static short readShort(DataInputStream is) throws IOException  {

return Short.reverseBytes(is.readShort());

}

/**

* 从输入流中读字符串 字符串 结构为一个指定字符串字节长度的短整型+实际字符 串

*

* @param is

* @return

* @throws IOException

*/

public static String readUTF(DataInputStream is) throws IOException  {

short s = readShort(is);

byte[] str = new byte[s];

is.readFully(str);

return new String(str, CHARSET);

}

/**

* 向输出流中写布尔

*

* @param os

* @param b

* @throws IOException

*/

public static void writeBoolean(DataOutputStream os, boolean b)

throws IOException {

os.writeBoolean(b);

}

/**

* 向输出流中写字节数组

*

* @param os

* @param data

* @throws IOException

*/

public static void writeBytes(DataOutputStream os, byte[] data)

throws IOException {

os.write(data);

}

/**

* 向输出流中写字符

*

* @param os

* @param b

* @throws IOException

*/

public static void writeChar(DataOutputStream os, char b)

throws IOException {

writeShort(os, (short) b);

}

/**

* 向输出流中写双精度

*

* @param os

* @param d

* @throws IOException

*/

public static void writeDouble(DataOutputStream os, double d)

throws IOException {

writeLong(os, Double.doubleToLongBits(d));

}

/**

* 向输出流中写单精度

*

* @param os

* @param f

* @throws IOException

*/

public static void writeFloat(DataOutputStream os, float f)

throws IOException {

writeInt(os, Float.floatToIntBits(f));

}

/**

* 向输出流中写整型

*

* @param os

* @param i

* @throws IOException

*/

public static void writeInt(DataOutputStream os, int i) throws  IOException {

os.writeInt(Integer.reverseBytes(i));

}

/**

* 向输出流中写长整型

*

* @param os

* @param l

* @throws IOException

*/

public static void writeLong(DataOutputStream os, long l)

throws IOException {

os.writeLong(Long.reverseBytes(l));

}

/**

* 向输出流中写短整型

*

* @param os

* @param s

* @throws IOException

*/

public static void writeShort(DataOutputStream os, short s)

throws IOException {

os.writeShort(Short.reverseBytes(s));

}

/**

* 向输出流中写字符串 字符串 结构 为 一个指定字符串字节长度的短整型+实际 字符串

*

* @param os

* @param str

* @throws IOException

*/

public static void writeUTF(DataOutputStream os, String str)

throws IOException {

byte[] data = str.getBytes(CHARSET);

writeShort(os, (short) data.length);

os.write(data);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值