Java与C底层数据类型转换

前段时间一直忙着做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);
}
}

时间: 2024-10-05 23:58:32

Java与C底层数据类型转换的相关文章

Java编程那些事儿19—数据类型转换

3.7 数据类型转换 Java语言是一种强类型的语言.强类型的语言有以下几个要求: l变量或常量必须有类型 要求声明变量或常量时必须声明类型,而且只能在声明以后才能使用. l赋值时类型必须一致 值的类型必须和变量或常量的类型完全一致. l运算时类型必须一致 参与运算的数据类型必须一致才能运算. 但是在实际的使用中,经常需要在不同类型的值之间进行操作,这就需要一种新的语法来适应这种需要,这个语法就是数据类型转换. 在数值处理这部分,计算机和现实的逻辑不太一样,对于现实来说,1和1.0没有什么区别,

简要JAVA数据类型转换

数据|数据类型|转换 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(my_str).intValue(); 注: 字串转成 Double, Float, Long 的方法大同小异. 2 如何将整数 int 转换成字串 String ? A. 有叁种

JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中,用户可以通过指定数据类型和标识符来声明变量,其基本语法为: DataType identifier;  或  DataType identifier = value; 其中,DataType是变量类型,如int/string/char/double/boolean等:identifier是变量名称,即标识符:value就是声明变量的值. 注: a.标识符由数字0-9.大小写字母.下划线.美元符号.人民币符号以及

Java数据类型转换详解_java

一.基本数据类型阐述 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型.[注]JAVA没有unsigned类型 (1). 整数:int,short,byte,long (2). 浮点型:float,double (3). 字符:char (4). 布尔:boolean 基本型别     大小         最小值            最大值 void boolean     -----         -----             

浅析Java中对象的创建与对象的数据类型转换_java

Java:对象创建和初始化过程 1.Java中的数据类型    Java中有3个数据类型:基本数据类型(在Java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型).引用类型和null类型.其中,引用类型包括类类型(含数组).接口类型.     下列语句声明了一些变量: int k ; A a; //a是A数据类型的对象变量名. B b1,b2,-,b10000;// 假定B是抽象类或接口. String s;      注意:从

最适合Java开发者的大数据工具和框架

文章讲的是最适合Java开发者的大数据工具和框架,当今编程人员面对的最大挑战就是复杂性,硬件越来越复杂,OS越来越复杂,编程语言和API越来越复杂,我们构建的应用也越来越复杂.根据外媒的一项调查报告,以下列出了Java程序员在过去12个月内一直使用的一些工具或框架,或许会对你有意义. 先来看看大数据的概念.根据维基百科,大数据是庞大或复杂的数据集的广义术语,因此传统的数据处理程序不足以支持如此庞大的体量. 在许多情况下,使用SQL数据库存储/检索数据都是很好的选择.而现如今的很多情况下,它都不再

Java Hash Collision之数据生产

上一篇文章一种高级的DoS攻击-Hash碰撞攻击我通过伪造Hash Collision数据实现了对Java的DoS攻击,下面说说如何生产大量的攻击数据. HashTable是一种非常常用的数据结构.它存取速度快,结构简单,深得程序员喜爱.HashTable大致数据结构如下图: Hash Function也叫哈希散列函数,通过散列函数我们能将各种类型的key转换为有限空间内的一个内存地址.常见的散列函数有MD5,SHA.不过HashTable中基本不会用MD5,SHA算法,因为这两类算法太耗时,基

Struts2请求数据自动封装和数据类型转换

Struts2请求数据自动封装: 实现原理:参数拦截器 方式1:jsp表单数据填充到action中的属性: //普通的成员变量,必须给set,get可以不给的. 方式2:jsp表单数据填充到action的对象的属性: //对象类型,一定给get方法 方式1: 第一步:引包,省去 第二步:配置struts2的过滤器 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="

SQL Server 2008处理隐式数据类型转换在执行计划中的增强

什么是隐式http://www.aliyun.com/zixun/aggregation/18278.html">数据类型转换: 当我们在语句的where 条件等式的左右提供了不同数据类型的列或者变量,SQL Server在处理等式之前,将其中一端的数据转换成跟另一端数值的数据类型一致,这个过程叫做隐式数据类型转换. 比如 char(50)=varchar(50), char(50)=nchar(50), int=float, int=char(20) 这些where 条件的等式都会触发隐