怎么将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
,表示为string
s(例如"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()
将十六进制表示中的字节解析为uint32
。 ParseUint()
总是返回 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(&b))
完全相同的不安全操作。
在Stack Overflow“上一个答案”没有意义,答案会根据投票和读者选项重新排序。如果您需要参考另一个答案,请使用“共享”链接获取链接。此外,仅链接的答案不适合 SO,您应该将链接中的相关部分(在本例中为代码)包含到帖子中。
欢迎来到 Stack Overflow!您还应该从答案中的链接中添加相关代码,而不是将链接粘贴到解决方案中。这样,如果链接断开,答案仍然可用。以上是关于怎么将4字节16进制转化成浮点数的主要内容,如果未能解决你的问题,请参考以下文章