精华内容
下载资源
问答
  • C语言:十六进制(HEX)和浮点类型(float、double)转换

    万次阅读 多人点赞 2020-07-20 09:34:18
    C语言:十六进制(HEX)和浮点类型(float、double)转换

    目录

    1、浮点类型转换为十六进制

    方法1:用地址用指针

    方法2:用共用体

    方法3: 使用memcpy

    2、十六进制转换为浮点类型


    近日在研究Modbus协议的时候遇到这样一个情况:使用ModScan32软件,可将HEX和浮点类型转换,如下所示:

    那么如何在程序设计中实现十六进制和浮点类型转换呢?

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。

    无论是单精度还是双精度在存储中都分为三个部分:

    1、符号位(Sign) :0代表正,1代表为负;

    2、指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储;

    3、尾数部分(Mantissa):尾数部分。

    其中float的存储方式如下图所示:

    而双精度的存储方式为:

    了解了基本概念后咱就开始代码实现吧~

    1、浮点类型转换为十六进制

    方法1:用地址用指针

    #include "stdio.h"
    
    int main(void)
    {
     float fa = 123.56;
     char farray[4] = {0};
    
     *(float*)farray = fa;
     
     printf("%f\n",*(float*)farray);
     
     return (0);
    }

    输出结果:

    123.559998

    方法2:用共用体

    #include "stdio.h"
    
    union {
     float fa;
     char farray[4];
    }utemp;
    
    int main(void)
    {
     int i = 0;
     float ft = 0.0;
     
     utemp.fa = (float)123.56;
     
     ft = *(float*)utemp.farray;
     
     printf("%f\n",ft);
     
     return (0);
    }

     输出结果:

    123.559998

    方法3: 使用memcpy

    #include "stdio.h"
    #include "string.h"
    
    int main(void)
    {
     float fa;
     char farray[4];
     float ft; 
     
     fa = 45.23;
     memcpy(farray,&fa,sizeof(farray));
     memcpy(&ft,&farray,sizeof(farray)); 
     printf("%f\n",ft);
     
     return (0);
    }

     输出结果:

    45.230000

    2、十六进制转换为浮点类型

    #include "stdio.h"
     
    int main(void)
    {
        unsigned char pMem[] = {0x66,0xE6,0xF0,0x42};
        float *p = (float*)pMem;
        printf("%g\r\n",*p);
    
        return 0;
    }

      输出结果:

    120.45
    

     最后为各位分享一个十分便利的十六进制和浮点类型互相转换的小工具

    参考链接,拓展学习:

    1、浮点数类型在计算机里面的表示方法

    2、浮点数在计算机中存储方式

    3、如何把一个float存到一个长度为4的char数组中?

    展开全文
  • Java 十六进制Hex)与byte数组之间的转换

    万次阅读 多人点赞 2017-11-27 23:00:06
    一、十六进制Hex)与字节(byte)的概念 十六进制Hex):计算机中数据的一种表示方法,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15。 字节(byte): java...

    一、十六进制(Hex)与字节(byte)的概念

    十六进制(Hex):计算机中数据的一种表示方法,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15。

    字节(byte):   java中一个byte为8个二进制位。

    转换原理:

        每个二进制位有两种状态,分别为0,1

        因此,两个二进制位有4种状态,分别为:00,01,10,11

        三个二进制位有8种状态,分别为000,001,010,011,100,101,110,111

        四个二进制位有十六种状态,0000,0001......1110,1111.   即十六进制

     

        一个十六进制数(Hex),正好为4个二进制位。一个字节(byte)为8个二进制位。因此,一个字节可表示为两个十六进制数字。

        因此,我们可以将一个byte用两个Hex表示,同理,我们也可以将两个Hex转换为一个byte。

    二、Java中Hex与byte的相互转换

    在java中,很多地方经常需要进行byte与Hex之间的转换,比如:某些加密的过程(MD5),通信的过程(TCP)。

    1.byte转Hex

    /** 
     * 字节转十六进制 
     * @param b 需要进行转换的byte字节 
     * @return  转换后的Hex字符串 
     */  
    public static String byteToHex(byte b){  
        String hex = Integer.toHexString(b & 0xFF);  
        if(hex.length() < 2){  
            hex = "0" + hex;  
        }  
        return hex;  
    }  
    很多时候,我们需要转换的是一个byte数组,一个一个byte调用上面的方法显然太麻烦。
    /** 
     * 字节数组转16进制 
     * @param bytes 需要转换的byte数组 
     * @return  转换后的Hex字符串 
     */  
    public static String bytesToHex(byte[] bytes) {  
        StringBuffer sb = new StringBuffer();  
        for(int i = 0; i < bytes.length; i++) {  
            String hex = Integer.toHexString(bytes[i] & 0xFF);  
            if(hex.length() < 2){  
                sb.append(0);  
            }  
            sb.append(hex);  
        }  
        return sb.toString();  
    }  
    2.Hex转byte

    需注意的是,Hex的字符串必须为十六进制的字符,否则会抛出异常。Hex的范围为0x00到0xFF。

    /** 
     * Hex字符串转byte 
     * @param inHex 待转换的Hex字符串 
     * @return  转换后的byte 
     */  
    public static byte hexToByte(String inHex){  
       return (byte)Integer.parseInt(inHex,16);  
    }  
    如果Hex超过0xFF,显然转换后结果不是一个byte,而是一个byte数组

    /** 
     * hex字符串转byte数组 
     * @param inHex 待转换的Hex字符串 
     * @return  转换后的byte数组结果 
     */  
    public static byte[] hexToByteArray(String inHex){  
        int hexlen = inHex.length();  
        byte[] result;  
        if (hexlen % 2 == 1){  
            //奇数  
            hexlen++;  
            result = new byte[(hexlen/2)];  
            inHex="0"+inHex;  
        }else {  
            //偶数  
            result = new byte[(hexlen/2)];  
        }  
        int j=0;  
        for (int i = 0; i < hexlen; i+=2){  
            result[j]=hexToByte(inHex.substring(i,i+2));  
            j++;  
        }  
        return result;   
    }  

    都是静态方法,复制粘贴直接用就可以了。喜欢的同学请点赞!





    展开全文
  • nodejs 二进制转十六进制hex

    万次阅读 2017-11-29 15:18:39
    小白的我纠结了好久,一个个尝试,终于把二进制转换成hex了var newdata = new Buffer(data,'hex');//先把数据存在buf里面 console.log(newdata.toString("hex"));//使用toString函数就能转换成hex数据啦参考 ...

    小白的我纠结了好久,一个个尝试,终于把二进制转换成hex了

    var newdata = new Buffer(data,'hex');//先把数据存在buf里面
    console.log(newdata.toString("hex"));//使用toString函数就能转换成hex数据啦

    参考
    https://www.cnblogs.com/tugenhua0707/p/4456300.html

    展开全文
  • 十六进制 1,二进制转换十六进制 2,四位二进制转换为一位十六进制。 3,以小数点为标准。 4,左右四位以0补齐。 例如:(0.10101)2=(0000. 1010 1000)2=(0.A8)16 5,参照十六进制计数的数。

    十六进制
    在这里插入图片描述
    在这里插入图片描述
    1,二进制转换十六进制
    2,四位二进制转换为一位十六进制。
    3,以小数点为标准。
    4,左右四位以0补齐。
    例如:(0.10101)2=(0000. 1010 1000)2=(0.A8)16
    5,参照十六进制计数的数。

    展开全文
  • 这几天在做一个与PLC交互的系统,PLC会传过来一些指令,这些指令是二进制的格式,要转为4位十进制的指令来读,下面是... * 二进制转十六进制方法 * @param bString * @return */ public static String bytes2hex(St
  • minicom 十六进制(hex)显示接收数据

    千次阅读 2017-09-21 18:55:00
    /******************************************************************************** ... * minicom 十六进制(hex)显示接收数据 * 说明: * 有些情况下,发送的数据不是ascii码,所以需要用hex显示。 * * ...
  • notepad++安装十六进制插件Hex Editer

    千次阅读 2020-07-11 18:23:41
    1、安装插件Hex Editer ...如果需要查看文件的十六进制,只需通过插件菜单下的Hex-Editer菜单项选择为View in HEX即可。 还有一种方式安装插件 插件-》插件管理-》搜hex-》安装 但是我这个版本没有,所以只能按照第一
  • #include #include #include #include using namespace std; map hex_to_bin; map bin_to_oct; map hex_to_oct; void init() { hex_to_bin['0'] = "0000"; hex_to_bin['1'] = "0001";... hex_to_bin['2'] =
  • matlab十六进制转十二进制代码char2hex-hex2char 将十进制整数字符串转换为十六进制表示形式,然后再返回到Matlab中。 版本1.2,2016年4月21日 下载资料库: 返回一个二维字符串数组,其中每行是S行中每个十进制整数...
  • while True: try: #print(int(input(),16)) #十六进制转十进制 int(‘0x2’,16) 十进制16进制hex() a=input('请输入一个十进制的数:') print(hex(int(a))) except: break
  • 十六进制数不带“0x”前缀时使用 = HEX2DEC(A1) A1为目标所在的表格坐标 十六进制数带“0x”前缀时使用 =HEX2DEC(RIGHT(A1,LEN(A1)-2)) 其中 RIGHT(A1,LEN(A1)-2) 是将A1所在单元格的内容将去掉前两个字节。 如果A1...
  • 第四章第十二题(十六进制转二进制)(Hex to binary) 4.12(十六进制转二进制)编写一个程序,提示用户输入一个十六进制数,显示其对应的二进制数。对于不正确的输入数字,提示非法输入。 下面是一个运行示例: ...
  • 解析参见:https://handsome-man.blog.csdn.net/article/details/107333529
  • /*0-9对应Ascii 48-57 *A-Z 65-90 *a-z 97-122 *第33~126号(共94个)是... * ASCII码hex字符串String明文 * 每两个字符表示的16进制ASCII码解析成一个明文字符 * @param hex * @return */...
  • void Int-To-Hex( uint32_t integer ) { uint8_t c; int i, j, digit; for ( i = 7, j = 0; i &gt;= 0; i--, j++ ) { digit = (integer &gt;&gt; (i * 4)) &amp; 0xf; if...
  • 适用于难把tcpdump文件从linux设备中抓下来,可以通过远程获得十六进制报文,直接转为wireshark格式。 tttttcpdumptcpdumptcpdump 2. 简略过程 tcpdump -xx -tt 直接把报文用十六进制打印出来 将报文导入软件...
  • 本文概述什么是十六进制十六进制是一种位置系统,以16为基数表示十六个不同的符号中的数字。这些不同的符号,即“ 0-9”代表从零到九的值,而“ A-F”代表从十到十五的值。什么是二进制?二进制数是一个以2为底的...
  • ASCLL码转换——十进制(Dec)十六进制(Hex)字符(Char)密码转换(zt) ASCII是英文American Standard Code for Information Interchange的缩写。ASCII码是目前计算机最通用的编码标准。 因为计算机只能...
  • 10进制转化为16进制 int setNum= 254; QString HEXNum = QString("%1").arg(setNum,0,16,QLatin1Char('0')).toUtf8(); qDebug() << "HEXNum: " << HEXNum; 16进制转化为10进制 bool ok; QString hex ...
  • 发送命令的时候需要先把命令成16进制的ASCII字符串。 接收到设备的反馈时需要把16进制的ASCII字符串成对应的明文。 比如我们要发送的明文为ABCDEF,需要先成对应的16进制ASCII码字符串414243444546 比如...
  • 发送十六进制比较直观,可以在上位机中直接获取十六进制的数据,然后在在上位机上将十六进制HEX转换成BIN(二进制)或者DEC(十进制)就十分简单有效了。 下面是在Arduino上怎么演示直接发送16进制。 详细请参考...
  • 十六进制与十进制批量转换Hex Dec MFC

    热门讨论 2011-03-20 13:47:17
    十六进制与十进制批量转换(Hex Dec) 通过MFC提供Dialog界面,包含文本颜色以及背景颜色设置等。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,316
精华内容 28,126
关键字:

十六进制转hex