怎么将4字节16进制转化成浮点数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么将4字节16进制转化成浮点数相关的知识,希望对你有一定的参考价值。

VC 和VB 里是怎么处理的 比如我有个16进制数0xC2C7FAE1,怎么转化为浮点数,要提供程序例子,VB和VC的都可以,提供一样给100分,谢谢

四个字节的十六机制数组转浮点数:

byte[bytes=newbyte[4];

BitConverter.ToSingle(bytes,0)。

四字节16进制数可转换为四个二进制字节(Bytes),从而使用Api函数来处理成单精度浮点数。以下用VB代码处理。

VB有专门的API函数CopyMemory能处理2-10进制浮点数转换和10-2进制浮点数转换。

扩展资料

例:

char p[4] = 0x1e,0x0d,0xa8,0x3c; 转换成浮点数:0.0205140,还有如何判断,这四个十六进制转换成浮点数是正数还是负数。

#include <stdio.h>

int main(void)

float a=0.0f;unsigned char * b 

= (unsigned char*)&a;

 char c[4] = 0x1e,0x0d,0xa8,0x3c; 

 int i = 0;

//printf("b1:%d\\n",b);

 for(i = 0; i<4; i++) b[i] 

= (unsigned char)c[i];

//printf("b2:%d\\n",*b);

 printf("结果为:\\n");

printf("%f\\n", a);

//printf("a:%d\\n",a)
参考技术A   四字节16进制数可转换为四个二进制字节(Bytes),从而使用Api函数来处理成单精度浮点数。

  以下用VB代码处理。
  VB有专门的API函数CopyMemory能处理2-10进制浮点数转换和10-2进制浮点数转换。
  下列代码演示了10进制Single(单精度浮点型转为16进制字符显示的浮点数和其相反运算:
  Option Explicit
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  Private Sub BinToSin_Click()
  Dim sinStr As String
  Dim sinSj As Single
  Dim Buffer(3) As Byte
  Dim i As Integer
  sinStr = Text2
  For i = 1 To Len(Text2) Step 2
  Buffer((7 - i) / 2) = Val("&H" & Mid(sinStr, i, 2))
  Next
  CopyMemory ByVal VarPtr(sinSj), ByVal VarPtr(Buffer(0)), 4
  Text3 = sinSj
  End Sub
  
  Private Sub SinToBin_Click()
  Dim i As Integer
  Dim hexData As String
  Dim a As Single
  Dim Buffer(3) As Byte
  a = Val(Text1)
  CopyMemory Buffer(0), a, 4
  For i = 0 To 3
  If Len(Hex(Buffer(i))) = 1 Then
  hexData = "0" & Hex(Buffer(i)) + hexData
  Else
  hexData = Hex(Buffer(i)) + hexData
  End If
  Next
  Text2 = hexData
  End Sub
  需要注意的事项是这四字节的高低字节排序,不能搞错。
  VB的Single 数据类型:
  Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。Single 的类型声明字符为感叹号 (!)。
  在内存以32位二进制形式存在:
  XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
  第1位为符号位;
  第2-9位为阶码位;
  第10-32位为2进制小数尾值;
  即F2 ^ n * 1. XXXXXXX XXXXXXXX XXXXXXXX;
  其中,F为正号或负号(首为为0正数,首位为1负数;
  n为2-9位组成的BYTE数据值;
  XXXXXXX XXXXXXXX XXXXXXXX为尾数。
  参考:http://blog.csdn.net/zdingyun/article/details/2528026
参考技术B 上面提供的方法((float)i;)都存在一个问题,即只是把整数强制转换为浮点数罢了,并不能解决楼主关心的问题。

有个简单的办法:

DWORD dwValue = 0xC2C7FAE1;
float fValue;

memcpy(&fValue, &dwValue, sizeof(DWORD));

printf("%f\n", fValue);本回答被提问者采纳
参考技术C int main()

int i = 0xC2C7FAE1;
float f = (float)i;// 就这样转换就行了。

return 0;


估计你的问题没说清楚,应该没那么简单的。
有问题再问,QQ:183323023
参考技术D int i = 0xC2C7FAE1;
float f = (float)i

如何将十六进制转换为浮点数

【中文标题】如何将十六进制转换为浮点数【英文标题】:How to convert hex to float 【发布时间】:2015-08-11 04:57:14 【问题描述】:

我必须将hex,表示为strings(例如"0xC40C5253")转换为浮点值(IEEE-754 转换)。我没有设法使用 strconv.ParseFloat 函数做到这一点。还有什么我必须使用的吗? 到目前为止我找不到它。我也试过先转换成整数再转换成浮点数,结果是错误的。

我上次尝试的代码:

package main

import (
  "fmt"
  "strconv"
)

func main () 
  x, err := strconv.ParseInt("C40C5253", 16, 64) 
  f, err := strconv.ParseFloat(fmt.Sprintf("%d", x), 64) 

  if err != nil 
    fmt.Printf("Error in conversion: %s\n", err)
   else 
    fmt.Println(f)
  

【问题讨论】:

我从你的代码中得到3.289141843e+09。这是正确的吗? 【参考方案1】:

首先需要说明输入的位长。由于十六进制表示有 4 个字节(8 个十六进制数字),它很可能是 float32(需要提问者澄清)。

您可以使用strconv.ParseUint() 将十六进制表示中的字节解析为uint32ParseUint() 总是返回 uint64,它在内存中使用 8 个字节,因此您必须将其转换为 uint32,它使用 4 个字节,就像 float32

s := "C40C5253"
n, err := strconv.ParseUint(s, 16, 32)
if err != nil 
    panic(err)

n2 = uint32(n)

现在您有了字节,但它们存储在uint32 类型的变量中,因此被解释为整数的字节。如果您想将它们解释为 IEEE-754 浮点数的字节,您可以使用 unsafe 包来做到这一点:

f := *(*float32)(unsafe.Pointer(&n2))
fmt.Println(f)

输出(在Go Playground上试试):

-561.2863

注意:

正如 JimB 所指出的,对于第二部分(将 uint32 转换为 float32),math 包有一个内置函数 math.Float32frombits(),它在后台执行此操作:

f := math.Float32frombits(n2)

【讨论】:

虽然它使用相同的不安全方法,但 math 包有像 Float64FromBits 这样的方法来做到这一点 根据this页面,结果必须是-561.2863 @Jan 不同之处在于该数字是 32 位浮点数,而不是您未说明的 64 位。这样做会得到预期的结果。 @icza 如果十六进制的大小代表多个 128 位怎么办,此代码将在 ParseUint 处失败 @AmitUpadhyay 显然是因为uint64 在 Go 中是 64 位的。如果您必须处理 128 位浮点数,请查看 big.Float【参考方案2】:

以下是产生 -561.2863 的两种不同方法:http://play.golang.org/p/Y60XB820Ib

import (
    "bytes"
    "encoding/binary"
    "encoding/hex"
    "math"
    "strconv"
)

func parse_read(s string) (f float32, err error) 
    b, err := hex.DecodeString(s)

    if err != nil 
        return
    

    buf := bytes.NewReader(b)

    err = binary.Read(buf, binary.BigEndian, &f)

    return


func parse_math(s string) (f float32, err error) 
    i, err := strconv.ParseUint(s, 16, 32)

    if err != nil 
        return
    

    f = math.Float32frombits(uint32(i))

    return

【讨论】:

【参考方案3】:

输入为 32 位,因此必须被视为 32 位数字。它也是无符号的,所以应该被解析为 uint,而不是 int。最后,没有必要使用不安全的操作,事实上,正如这里使用的那样,它们在具有不同字节顺序的机器上会失败。

改为使用math.Float32frombits,它完全符合您的要求:

package main

import (
    "fmt"
    "math"
    "strconv"
)

func main() 
    s := "C40C5253"
    n, err := strconv.ParseUint(s, 16, 32)
    if err != nil 
        panic(err)
    

    nn := uint32(n)

    g := math.Float32frombits(nn)
    fmt.Println(g)

输出:

-561.2863

http://play.golang.org/p/y1ZjH9pscy

【讨论】:

无需对其他答案进行社论。字节顺序也没有问题,因为数学包执行与*(*float32)(unsafe.Pointer(&amp;b))完全相同的不安全操作。 在Stack Overflow“上一个答案”没有意义,答案会根据投票和读者选项重新排序。如果您需要参考另一个答案,请使用“共享”链接获取链接。此外,仅链接的答案不适合 SO,您应该将链接中的相关部分(在本例中为代码)包含到帖子中。 欢迎来到 Stack Overflow!您还应该从答案中的链接中添加相关代码,而不是将链接粘贴到解决方案中。这样,如果链接断开,答案仍然可用。

以上是关于怎么将4字节16进制转化成浮点数的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何将10进制的浮点数转化为16进制数

Java 将字节转化为16进制字符串

excel表格如何将十六进制转换成浮点数

16进制字符串如何转化16进制数值

16进制浮点数(正和负数)转化成十进制显示,绝对成功显示

十进制转化为十六进制怎么算