char msg[]={0x01,0x02,0x03, 0x04};
创新互联建站自2013年创立以来,是专业互联网技术服务公司,拥有项目成都网站设计、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元仙游做网站,已为上家服务,为仙游各地企业和个人服务,联系电话:13518219792
for(i=0;i*23;i++)
{
printf("0x%02x%02x\n",msg[i*2],msg[i*2+1]);
}
1、4字节指的是有4个内存单元,每个单元各放着一个0~255的整数,拼凑起来形成一个32个二进制位的数儿;
2、根据不同的视角来看待或理解这个数儿,可以得出很多不同的答案;
3、针对你的问题,其实是“将视角切换为单精度浮点数”,单精度浮点数在内存单元中如何表示,是个挺复杂的事儿,具体是国际电气标准ieee754规定的,如果你能看懂,绝对可以品味到其中的精彩,这个才是最核心的“原理”;
4、从你的描述上看,似乎也并不是想了解到最底层的透彻,仅仅是了解这段程序如何能工作,如果是这样的话,答案是:强制类型转换。(float*)cbyte的意思是带上一副“单精度浮点数”的眼镜,去看cbyte数组中的内容,前面再加一个*,意思是“看好了,拿出来”。
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
把一个4位数组的地址赋给一个single变量
var
bSingle:array[0..3] of byte
s :single;
begin
bSingle[0] :=第 1个字节; // 有可能字符反向,即第 4个字节
bSingle[1] := 第 2个字节;
bSingle[2] := 第 3个字节;
bSingle[3] := 第 4个字节;
s := PSingle(@bSingle[0])^;
楼主你好.
楼上的解决方式是很对的。
这个问题的解决需要这样的一个思想:将需要转换的数值的地址取出,赋值给一个“想要转换成的”数据类型的地址(也就是指针),然后取需要的内存单元中的内容就可以了
例如对一个赋了值的十六进制的变量n,需要转换成float型的,就是先取其地址n,赋给一个float型的指针,也就是(float*)n,然后取指针的内容*(float)n就可以了。
需要注意的是,这个方法只适用于所需转换的数据在内存中所占大小与需要转换成的数据类型在内存中所占大小相同的情况(如VC6中,float型数据占4个字节,而每个字节是两位十六进制数,4个字节也就是八位十六进制数,正好等于你需要转换的十六进制数的位数,故此方法可行)
希望我的回答能帮到你~!
以下附上参考程序段:
#include stdio.h
float Hex_To_Decimal(unsigned char *Byte,int num)//十六进制到浮点数
{
// char cByte[4];//方法一
// for (int i=0;inum;i++)
// {
// cByte[i] = Byte[i];
// }
//
// float pfValue=*(float*)cByte;
//return pfValue;
return *((float*)Byte);//方法二
}
long FloatTohex(float HEX)//浮点数到十六进制转换1
{
return *( long *)HEX;
}
void FloatToByte(float floatNum,unsigned char* byteArry)////浮点数到十六进制转换2
{
char* pchar=(char*)floatNum;
for(int i=0;isizeof(float);i++)
{
*byteArry=*pchar;
pchar++;
byteArry++;
}
}
void main()
{
unsigned char floatToHex[4];
unsigned char hexbyte[4]={0xd0,0x0f,0x49,0x40};//传输数据为3d cc cc cd,0xcd,0xCC,0xCC,0x3D,40490fd0
float Hdecimal=0.0;
float flh=0.4;
Hdecimal=Hex_To_Decimal(hexbyte,sizeof(hexbyte));//十六进制转换为浮点数
printf("\n 浮点数为:\n %f\n",Hdecimal);
long hX=FloatTohex(Hdecimal);//浮点数转换为十六进制一
printf("\n正序十六进制值:\n %f=%X \n",Hdecimal,hX);//正序显示
FloatToByte(Hdecimal,floatToHex);//浮点数转为十六进制二
printf("\n倒序十六进制:\n%f=%x %x %x %x\n",Hdecimal,floatToHex[0],floatToHex[1],floatToHex[2],floatToHex[3] );//倒序显示
}