`
wxyfighting
  • 浏览: 191860 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Java 与 C 底层数据类型转换

 
阅读更多
Java代码收藏代码
  1. importjava.io.DataInputStream;
  2. importjava.io.DataOutputStream;
  3. importjava.io.IOException;
  4. /**
  5. *仅仅适用于Java与C++通讯中,网络流解析与生成使用
  6. *
  7. *高低位互换(Big-Endian大头在前&Little-Endian小头在前)。
  8. *举例而言,有一个4字节的数据0x01020304,要存储在内存中或文件中编号0˜3字节的位置,两种字节序的排列方式分别如下:
  9. *<pre>
  10. *BigEndian
  11. *
  12. *低地址高地址
  13. *----------------------------------------------------&gt;
  14. *地址编号
  15. *|0|1|2|3|
  16. *+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  17. *|01|02|03|04|
  18. *+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  19. *
  20. *LittleEndian
  21. *
  22. *低地址高地址
  23. *----------------------------------------------------&gt;
  24. *地址编号
  25. *|0|1|2|3|
  26. *+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  27. *|04|03|02|01|
  28. *+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  29. *</pre>
  30. *Java则统一使用big模式
  31. *c中的unsignedshort对应着java中的char两个字节,无符号
  32. *c的无符号int,short,byte字节数组,相应转换成java的long,char,short
  33. *
  34. *@authorSnowolf
  35. *@version1.0
  36. *@since1.0
  37. */
  38. publicabstractclassCIOUtil{
  39. publicstaticfinalStringCHARSET="UTF-8";
  40. /**
  41. *从输入流中读布尔
  42. *
  43. *@paramis
  44. *@return
  45. *@throwsIOException
  46. */
  47. publicstaticbooleanreadBoolean(DataInputStreamis)throwsIOException{
  48. returnis.readBoolean();
  49. }
  50. /**
  51. *从流中读定长度字节数组
  52. *
  53. *@paramis
  54. *@params
  55. *@return
  56. *@throwsIOException
  57. */
  58. publicstaticbyte[]readBytes(DataInputStreamis,inti)
  59. throwsIOException{
  60. byte[]data=newbyte[i];
  61. is.readFully(data);
  62. returndata;
  63. }
  64. /**
  65. *从输入流中读字符
  66. *
  67. *@paramis
  68. *@return
  69. *@throwsIOException
  70. */
  71. publicstaticcharreadChar(DataInputStreamis)throwsIOException{
  72. return(char)readShort(is);
  73. }
  74. /**
  75. *从输入流中读双精度
  76. *
  77. *@paramis
  78. *@return
  79. *@throwsIOException
  80. */
  81. publicstaticdoublereadDouble(DataInputStreamis)throwsIOException{
  82. returnDouble.longBitsToDouble(readLong(is));
  83. }
  84. /**
  85. *从输入流中读单精度
  86. *
  87. *@paramis
  88. *@return
  89. *@throwsIOException
  90. */
  91. publicstaticfloatreadFloat(DataInputStreamis)throwsIOException{
  92. returnFloat.intBitsToFloat(readInt(is));
  93. }
  94. /**
  95. *从流中读整型
  96. *
  97. *@paramis
  98. *@return
  99. *@throwsIOException
  100. */
  101. publicstaticintreadInt(DataInputStreamis)throwsIOException{
  102. returnInteger.reverseBytes(is.readInt());
  103. }
  104. /**
  105. *从流中读长整型
  106. *
  107. *@paramis
  108. *@return
  109. *@throwsIOException
  110. */
  111. publicstaticlongreadLong(DataInputStreamis)throwsIOException{
  112. returnLong.reverseBytes(is.readLong());
  113. }
  114. /**
  115. *从流中读短整型
  116. *
  117. *@paramis
  118. *@return
  119. *@throwsIOException
  120. */
  121. publicstaticshortreadShort(DataInputStreamis)throwsIOException{
  122. returnShort.reverseBytes(is.readShort());
  123. }
  124. /**
  125. *从输入流中读字符串字符串结构为一个指定字符串字节长度的短整型+实际字符串
  126. *
  127. *@paramis
  128. *@return
  129. *@throwsIOException
  130. */
  131. publicstaticStringreadUTF(DataInputStreamis)throwsIOException{
  132. shorts=readShort(is);
  133. byte[]str=newbyte[s];
  134. is.readFully(str);
  135. returnnewString(str,CHARSET);
  136. }
  137. /**
  138. *向输出流中写布尔
  139. *
  140. *@paramos
  141. *@paramb
  142. *@throwsIOException
  143. */
  144. publicstaticvoidwriteBoolean(DataOutputStreamos,booleanb)
  145. throwsIOException{
  146. os.writeBoolean(b);
  147. }
  148. /**
  149. *向输出流中写字节数组
  150. *
  151. *@paramos
  152. *@paramdata
  153. *@throwsIOException
  154. */
  155. publicstaticvoidwriteBytes(DataOutputStreamos,byte[]data)
  156. throwsIOException{
  157. os.write(data);
  158. }
  159. /**
  160. *向输出流中写字符
  161. *
  162. *@paramos
  163. *@paramb
  164. *@throwsIOException
  165. */
  166. publicstaticvoidwriteChar(DataOutputStreamos,charb)
  167. throwsIOException{
  168. writeShort(os,(short)b);
  169. }
  170. /**
  171. *向输出流中写双精度
  172. *
  173. *@paramos
  174. *@paramd
  175. *@throwsIOException
  176. */
  177. publicstaticvoidwriteDouble(DataOutputStreamos,doubled)
  178. throwsIOException{
  179. writeLong(os,Double.doubleToLongBits(d));
  180. }
  181. /**
  182. *向输出流中写单精度
  183. *
  184. *@paramos
  185. *@paramf
  186. *@throwsIOException
  187. */
  188. publicstaticvoidwriteFloat(DataOutputStreamos,floatf)
  189. throwsIOException{
  190. writeInt(os,Float.floatToIntBits(f));
  191. }
  192. /**
  193. *向输出流中写整型
  194. *
  195. *@paramos
  196. *@parami
  197. *@throwsIOException
  198. */
  199. publicstaticvoidwriteInt(DataOutputStreamos,inti)throwsIOException{
  200. os.writeInt(Integer.reverseBytes(i));
  201. }
  202. /**
  203. *向输出流中写长整型
  204. *
  205. *@paramos
  206. *@paraml
  207. *@throwsIOException
  208. */
  209. publicstaticvoidwriteLong(DataOutputStreamos,longl)
  210. throwsIOException{
  211. os.writeLong(Long.reverseBytes(l));
  212. }
  213. /**
  214. *向输出流中写短整型
  215. *
  216. *@paramos
  217. *@params
  218. *@throwsIOException
  219. */
  220. publicstaticvoidwriteShort(DataOutputStreamos,shorts)
  221. throwsIOException{
  222. os.writeShort(Short.reverseBytes(s));
  223. }
  224. /**
  225. *向输出流中写字符串字符串结构为一个指定字符串字节长度的短整型+实际字符串
  226. *
  227. *@paramos
  228. *@paramstr
  229. *@throwsIOException
  230. */
  231. publicstaticvoidwriteUTF(DataOutputStreamos,Stringstr)
  232. throwsIOException{
  233. byte[]data=str.getBytes(CHARSET);
  234. writeShort(os,(short)data.length);
  235. os.write(data);
  236. }
  237. }

再写个测试类
Java代码收藏代码
  1. importjava.io.ByteArrayInputStream;
  2. importjava.io.ByteArrayOutputStream;
  3. importjava.io.DataInputStream;
  4. importjava.io.DataOutputStream;
  5. importjava.io.IOException;
  6. importorg.junit.Test;
  7. importstaticorg.junit.Assert.*;
  8. /**
  9. *
  10. *@authorSnowolf
  11. *@version1.0
  12. *@since1.0
  13. */
  14. publicclassCIOUtilTest{
  15. /**
  16. *测试布尔值
  17. *
  18. *@throwsIOException
  19. */
  20. @Test
  21. publicfinalvoidtestBoolean()throwsIOException{
  22. booleaninput=true;
  23. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  24. DataOutputStreamos=newDataOutputStream(baos);
  25. CIOUtil.writeBoolean(os,input);
  26. byte[]b=baos.toByteArray();
  27. baos.flush();
  28. baos.close();
  29. ByteArrayInputStreambais=newByteArrayInputStream(b);
  30. DataInputStreamis=newDataInputStream(bais);
  31. booleanoutput=CIOUtil.readBoolean(is);
  32. bais.close();
  33. assertEquals(input,output);
  34. }
  35. /**
  36. *测试字节数组
  37. *
  38. *@throwsIOException
  39. */
  40. @Test
  41. publicfinalvoidtestBytes()throwsIOException{
  42. byte[]input="中文".getBytes("UTF-8");
  43. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  44. DataOutputStreamos=newDataOutputStream(baos);
  45. CIOUtil.writeBytes(os,input);
  46. byte[]b=baos.toByteArray();
  47. baos.flush();
  48. baos.close();
  49. ByteArrayInputStreambais=newByteArrayInputStream(b);
  50. DataInputStreamis=newDataInputStream(bais);
  51. byte[]output=CIOUtil.readBytes(is,6);
  52. bais.close();
  53. assertArrayEquals(input,output);
  54. }
  55. /**
  56. *测试字符
  57. *
  58. *@throwsIOException
  59. */
  60. @Test
  61. publicfinalvoidtestChar()throwsIOException{
  62. charinput='中';
  63. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  64. DataOutputStreamos=newDataOutputStream(baos);
  65. CIOUtil.writeChar(os,input);
  66. byte[]b=baos.toByteArray();
  67. baos.flush();
  68. baos.close();
  69. ByteArrayInputStreambais=newByteArrayInputStream(b);
  70. DataInputStreamis=newDataInputStream(bais);
  71. charoutput=CIOUtil.readChar(is);
  72. bais.close();
  73. assertEquals(input,output);
  74. }
  75. /**
  76. *测试双精度
  77. *
  78. *@throwsIOException
  79. */
  80. @Test
  81. publicfinalvoidtestDouble()throwsIOException{
  82. doubleinput=1.23456789d;
  83. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  84. DataOutputStreamos=newDataOutputStream(baos);
  85. CIOUtil.writeDouble(os,input);
  86. byte[]b=baos.toByteArray();
  87. baos.flush();
  88. baos.close();
  89. ByteArrayInputStreambais=newByteArrayInputStream(b);
  90. DataInputStreamis=newDataInputStream(bais);
  91. doubleoutput=CIOUtil.readDouble(is);
  92. bais.close();
  93. assertEquals(input,output,9);
  94. }
  95. /**
  96. *测试单精度
  97. *
  98. *@throwsIOException
  99. */
  100. @Test
  101. publicfinalvoidtestFloat()throwsIOException{
  102. floatinput=1.23456789f;
  103. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  104. DataOutputStreamos=newDataOutputStream(baos);
  105. CIOUtil.writeFloat(os,input);
  106. byte[]b=baos.toByteArray();
  107. baos.flush();
  108. baos.close();
  109. ByteArrayInputStreambais=newByteArrayInputStream(b);
  110. DataInputStreamis=newDataInputStream(bais);
  111. floatoutput=CIOUtil.readFloat(is);
  112. bais.close();
  113. assertEquals(input,output,9);
  114. }
  115. /**
  116. *测试整型
  117. *
  118. *@throwsIOException
  119. */
  120. @Test
  121. publicfinalvoidtestInt()throwsIOException{
  122. intinput=1;
  123. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  124. DataOutputStreamos=newDataOutputStream(baos);
  125. CIOUtil.writeInt(os,input);
  126. byte[]b=baos.toByteArray();
  127. baos.flush();
  128. baos.close();
  129. ByteArrayInputStreambais=newByteArrayInputStream(b);
  130. DataInputStreamis=newDataInputStream(bais);
  131. intoutput=CIOUtil.readInt(is);
  132. bais.close();
  133. assertEquals(input,output);
  134. }
  135. /**
  136. *测试长整型
  137. *
  138. *@throwsIOException
  139. */
  140. @Test
  141. publicfinalvoidtestLong()throwsIOException{
  142. longinput=1l;
  143. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  144. DataOutputStreamos=newDataOutputStream(baos);
  145. CIOUtil.writeLong(os,input);
  146. byte[]b=baos.toByteArray();
  147. baos.flush();
  148. baos.close();
  149. ByteArrayInputStreambais=newByteArrayInputStream(b);
  150. DataInputStreamis=newDataInputStream(bais);
  151. longoutput=CIOUtil.readLong(is);
  152. bais.close();
  153. assertEquals(input,output);
  154. }
  155. /**
  156. *测试短整型
  157. *
  158. *@throwsIOException
  159. */
  160. @Test
  161. publicfinalvoidtestShort()throwsIOException{
  162. shortinput=1;
  163. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  164. DataOutputStreamos=newDataOutputStream(baos);
  165. CIOUtil.writeShort(os,input);
  166. byte[]b=baos.toByteArray();
  167. baos.flush();
  168. baos.close();
  169. ByteArrayInputStreambais=newByteArrayInputStream(b);
  170. DataInputStreamis=newDataInputStream(bais);
  171. shortoutput=CIOUtil.readShort(is);
  172. bais.close();
  173. assertEquals(input,output);
  174. }
  175. /**
  176. *测试UTF-8字符串
  177. *
  178. *@throwsIOException
  179. */
  180. @Test
  181. publicfinalvoidtestUTF()throwsIOException{
  182. Stringinput="中文支持";
  183. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  184. DataOutputStreamos=newDataOutputStream(baos);
  185. CIOUtil.writeUTF(os,input);
  186. byte[]b=baos.toByteArray();
  187. baos.flush();
  188. baos.close();
  189. ByteArrayInputStreambais=newByteArrayInputStream(b);
  190. DataInputStreamis=newDataInputStream(bais);
  191. Stringoutput=CIOUtil.readUTF(is);
  192. bais.close();
  193. assertEquals(input,output);
  194. }
  195. }
分享到:
评论

相关推荐

    netty 在java中的字节码转换

    netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    近5年133个Java面试问题列表

    数据类型转换的基本原则 垃圾回收(GC) Java 集合框架 数组 字符串 GOF 设计模式 SOLID (单一功能、 开闭原则、 里氏替换、 接口隔离以及依赖反转) 设计原则 抽象类与接口 Java 基础, 如 equals 和 hashcode ...

    java开源包11

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包4

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包6

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包101

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包9

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包5

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包8

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包10

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包3

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包1

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...

Global site tag (gtag.js) - Google Analytics