Java与C底层数据类型转换
来源:互联网 发布:sql报表编辑器 编辑:程序博客网 时间:2024/04/30 08:54
前段时间一直忙着做J2EE服务器与C++客户端的项目。终于,项目告一段落,有一些收获 在这里与大家分享。
Java代码
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);}}
再写个测试类
Java代码
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import org.junit.Test;import static org.junit.Assert.*;/** * * @author Snowolf * @version 1.0 * @since 1.0 */public class CIOUtilTest {/** * 测试布尔值 * * @throws IOException */@Testpublic final void testBoolean() throws IOException {boolean input = true;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeBoolean(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);boolean output = CIOUtil.readBoolean(is);bais.close();assertEquals(input, output);}/** * 测试字节数组 * * @throws IOException */@Testpublic final void testBytes() throws IOException {byte[] input = "中文".getBytes("UTF-8");ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeBytes(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);byte[] output = CIOUtil.readBytes(is, 6);bais.close();assertArrayEquals(input, output);}/** * 测试字符 * * @throws IOException */@Testpublic final void testChar() throws IOException {char input = '中';ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeChar(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);char output = CIOUtil.readChar(is);bais.close();assertEquals(input, output);}/** * 测试双精度 * * @throws IOException */@Testpublic final void testDouble() throws IOException {double input = 1.23456789d;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeDouble(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);double output = CIOUtil.readDouble(is);bais.close();assertEquals(input, output, 9);}/** * 测试单精度 * * @throws IOException */@Testpublic final void testFloat() throws IOException {float input = 1.23456789f;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeFloat(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);float output = CIOUtil.readFloat(is);bais.close();assertEquals(input, output, 9);}/** * 测试整型 * * @throws IOException */@Testpublic final void testInt() throws IOException {int input = 1;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeInt(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);int output = CIOUtil.readInt(is);bais.close();assertEquals(input, output);}/** * 测试长整型 * * @throws IOException */@Testpublic final void testLong() throws IOException {long input = 1l;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeLong(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);long output = CIOUtil.readLong(is);bais.close();assertEquals(input, output);}/** * 测试短整型 * * @throws IOException */@Testpublic final void testShort() throws IOException {short input = 1;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeShort(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);short output = CIOUtil.readShort(is);bais.close();assertEquals(input, output);}/** * 测试UTF-8字符串 * * @throws IOException */@Testpublic final void testUTF() throws IOException {String input = "中文支持";ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream os = new DataOutputStream(baos);CIOUtil.writeUTF(os, input);byte[] b = baos.toByteArray();baos.flush();baos.close();ByteArrayInputStream bais = new ByteArrayInputStream(b);DataInputStream is = new DataInputStream(bais);String output = CIOUtil.readUTF(is);bais.close();assertEquals(input, output);}}
- Java 与 C 底层数据类型转换
- Java 与 C 底层数据类型转换
- Java与C底层数据类型转换
- Java 与 C 底层数据类型转换
- Java与C底层数据类型转换
- Java与底层数据类型关系
- java数据类型与转换
- JAVA数据类型与转换
- C与Powerbuilder数据类型转换
- C#---数据类型转换与转型
- NDK Java C 数据类型转换
- Java数据类型与JNI数据类型转换
- hadoop数据类型与java 数据类型的转换
- MySql与Java数据类型转换
- MySql与Java 数据类型转换
- Actionscript与Java数据类型转换
- JAVA数据类型自动转换,与强制转换
- JAVA日期格式转换与数据类型转换
- c++设计模式--组合模式
- android Random的使用
- 用故事讲解虚函数。
- 12枚或者13枚鸡蛋,有一个坏的,用天平3次称出来
- rsync: failed to connect to x.x.x.x: Connection refused (111)
- Java与C底层数据类型转换
- 动态语言跟静态语言
- ASP.NET MVC4.0发布网站
- C++ AMP 概述
- ActivityGroup + GridView 实现Tab分页标签
- android在adapter中调用activity跳转效果
- Android XcapClinet 二
- iPhone开发:单独添加.xib文件
- 获取分辨率 尺寸、样式