java和c通信相关的数据类型转换
利用socket进行网络传输的时候往往需要将int转换为bytes,将string转换为bytes以及一些其他类型的数据转换
java和c类型的区别:
变量类型 C中字节数 Java中字节数
char
byte 无
short
int
long
int 和bytes
int-bytes
:Integer.toString(int b).getBytes());
:
public static void int2Bytes(int i, byte[] buf, int offset) {
buf[offset] = (byte) i;
i >>= ;
buf[offset + ] = (byte) i;
i >>= ;
buf[offset + ] = (byte) i;
i >>= ;
buf[offset + ] = (byte) i;
}
bytes-int
:Integer.parseInt((bytes[] b).toString())
:
private static int byte2Int(byte[] bs) {
int retVal = ;
int len = bs.length < ? bs.length : ;
for (int i = ; i < len; i++) {
retVal |= (bs[i] & 0xFF) << ((i & 0x03) << );
}
return retVal;
// 如果确定足4位,可直接返回值
//return (bs[0]&0xFF) | ((bs[1] & 0xFF)<<8) | ((bs[2] & 0xFF)<<16) | ((bs[3] & 0xFF)<<24);
}
int和String
int-String int i
:Integer.toString(i,xx); //xx为想要用什么进制来表示,缺省为10进制
:i+" ";
:String.valueOf(i);//和1不同的是他可以转换的除了对象还可以为基本数据类型比如long boolean double
//而且i可以为null但是1的i为null的话就会报错抛出异常
String-int String s
:Integer.parseInt(s)
bytes和String
String-bytes:(String a)
:a.getBytes(x);//x为指定的编码,缺省的话为utf-8
//同一个字符串调用a.getBytes()两次并且分别打印,他们的内容会不同,调用一次返回的都是一个新的数组对像, 你打印的是对象引用的哈希码(不是对像里面的内容),
//肯定是不一样的(因为每次返回都是一个新的变量).他们的内容是一样的.
:(byte)a.charAt(i)
bytes-String :bytes[] b
:String a=new String(b,x);//x为指定的编码,缺省的话为utf-8
:
StringBuffer sb=new StringBuffer();
for(int i=;i<b.length;i++){
sb.append((char)b[i]);
}
System.out.println(sb.toString());
特别注意编码问题:
1:
bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
String string = new String(bytes);
byte[] ret = string.getBytes();
查看ret的数据发现是50, 0, -17, -65, -67, 28, -17, -65, -67,发现数据并不是原来的数据。
而使用如下代码就可以得到原来的数据:
2:
bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
StringisoString = new String(bytes, "ISO-8859-1");
byte[] isoret = isoString.getBytes("ISO-8859-1");
第一种方法默认是用UTF-8编码来生成String的,用System.getProperty("sun.jnu.encoding")可以得到
Android默认编码是UTF-8。UTF-8是可变长度的编码,原来的字节数组就被改变了。而ISO8859-1通常叫做
Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中 0~127的字符与ASCII码相同,
它是单字节的编码方式,这样第二种方式生成的String里的字节数组就跟原来的字节数组一样。在new String
使用其他编码如GBK,GB2312的话一样也会导致字节数组发生变化,因此要想获取String里单字节数组,就应该
使用iso8859-1编码。
java和c通信相关的数据类型转换的更多相关文章
- Java知多少(11)数据类型转换
数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换:强制类型转换则必须在代码中声明,转换顺序不受限制. 自 ...
- java===java基础学习(3)---数据类型转换,运算符级别,枚举类型
数据类型转换: 有的时候,程序需要将数据类型,比如 int + float ,结果是float, 这里的int就被转换为float类型,属于合法转换. Java中的合法转换如下图: 红色表示无信息丢失 ...
- (6)java基础知识-基本数据类型、数据类型转换
一.基本数据类型 基本的数据类型一共有四类八种 1.整型 byte: 1字节 取值范围 -128~127 short: 2字节 取值范围 -32768~32767 int: 4字节 取 ...
- Java基础笔记(五)——数据类型转换
数据类型的精度由低到高为:byte < short < char < int < long < float < double 低精度的类型与高精度的类型在进行运算时 ...
- Hibernate Java、Hibernate、SQL 之间数据类型转换
Hibernate映射类型 Java类型 标准SQL类型 integer java.lang.Integer integer long java.lang.Long bigint sho ...
- JAVA基础知识(五)数据类型转换
当使用 +.-.*./.%.运算操作时,遵循如下规则: 1.只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型: 2.如果两个操作数中有一个 ...
- java基础之数据类型转换
在写java程序时,经常会遇到需要数据类型转换,下面我们来介绍一些一些基本数据类型之间的转换. 1.int,folat,double,boolean,long 转换成字符串,其实很简单只需使用一个函数 ...
- Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...
- Java基础知识强化22:Java中数据类型转换
数据类型转换: (1). 自动转换 低级变量可以直接转换为高级变量,这叫自动类型转换.比如: byte b: int b: long b: float b: double b: 上面的语句可 ...
随机推荐
- Linux VFS机制简析(二)
Linux VFS机制简析(二) 接上一篇Linux VFS机制简析(一),本篇继续介绍有关Address space和address operations.file和file operations. ...
- sqlserver2008 调试存储过程
1.创建所需要调试的存储过程,并执行一下,也就是保存好 ,我要演示的存储过程名是 “usp_Passport_GetNewDepositary” 2.找到存储过程,右键“执行存储过程”,会弹出如下的界 ...
- TortoiseSVN安装
安装说明 开发人员强烈建议使用IDE中的SVN插件更加智能与人性化. 首先安装SVN客户端,windows一般选择乌龟客户端https://tortoisesvn.net/downloads.html ...
- 序列化json和protobuf大小比较
使用protobuf序列化为二进制和json序列化字符串大小比较 代码demo package com.gxf.demo; import java.io.*; public class Ptotobu ...
- Facade模式实现文件上传(Flash+HTML5)
一.前言 确定了渐进式增强的上传方式,接下来我们需要将上传功能从具体的业务逻辑中剥离出来,作为公共组件供业务层调用.这就要求我们必须对业务层隐藏上传细节,只暴露统一的上传API.这时候大家是不是跟我一 ...
- 数组和矩阵(3)——Next Greater Element I
https://leetcode.com/problems/next-greater-element-i/#/description You are given two arrays (without ...
- H5前端的行业知识
今天咱们不说代码!咱们说点行内的只是吧!! 一.前端基本技能: 会点设计,不要求精湛,处理图片,设计个小广告是要的: 精通HTML+CSS,并能快速处理各浏览器兼容问题: 熟练掌握Javascript ...
- UITableViewCell 分割线如何满屏
在iOS7中,UITableViewCell左侧会有默认15像素的空白.设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在iOS8中,设置setSepar ...
- Hbase到Solr同步常用操作
Hbase到Solr同步常用操作 1. 整体流程 2. 常用操作 Hbase常用操作 Solr常用操作 hbase-index常用操作 3. 其他资料 Lily HBase Indexer使用整理 h ...
- Android 时间范围选择器PickTimeDialog
个人提供了自己封装的第三方时间选择器,能够自定义时间格式,以及设置时间范围. 基础使用 PickTimeDialog pickDilog= new PickTimeDialog(this).setMa ...