把一个单精度浮点数保存到一个四个长度的字节类型数组中,用.NET实现如下:
private void button1_Click(object sender, EventArgs e)
{ //byte[] b = Encoding.ASCII.GetBytes("-1.23");
//textBox1.Text = GetHexStr(b);
string s = "";
float value = -1.23F;
byte[] bytes = System.BitConverter.GetBytes(value);
foreach (byte bt in bytes)
{
s += " 0x" + GetHexStr(bt);
}
textBox1.Text = s;
//return s;
}
/// <summary>
/// 将字节数组转换为16进制字符串
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public static string GetHexStr(byte data)
{
return data.ToString("X2");
}
怎样用delphi实现?
private void button1_Click(object sender, EventArgs e)
{ //byte[] b = Encoding.ASCII.GetBytes("-1.23");
//textBox1.Text = GetHexStr(b);
string s = "";
float value = -1.23F;
byte[] bytes = System.BitConverter.GetBytes(value);
foreach (byte bt in bytes)
{
s += " 0x" + GetHexStr(bt);
}
textBox1.Text = s;
//return s;
}
/// <summary>
/// 将字节数组转换为16进制字符串
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public static string GetHexStr(byte data)
{
return data.ToString("X2");
}
怎样用delphi实现?
f:single;
b:array[0..3] of byte;begin
f:=1.23;
move(f,b,sizeof(f));
end;
asm
BSWAP eax
end;var
float_4: Single;
dwTemp: LongWord;
byte_4: array[0..3] of byte;
begin
float_4 := 100.99;
dwTemp := ByteSwap(PLongWord(@float_4)^);
move(dwTemp, byte_4, 4);
ShowMessage(format('%02x %02x %02x %02x',[byte_4[0],byte_4[1],byte_4[2],byte_4[3]]));
end;
var
f:single;
b:array[0..3] of byte; begin
f:=1.23;
move(f,b,sizeof(f));
f := 0;
move(b,f,sizeof(f)); //f又变成1.23了
end;总结一下:对于单精度,数组长度是4,双精度,长度为8。这和浮点类型数据的长度是对应的。
以上代码的结果高低字节刚好反过来了,这大概和MOVE函数有关吧!
这种做法在数据传输是很有用的,仅仅四个字节,但绝对没有损失任何精度。
以下是另外一种做法:
var p : Pointer;
S: String;
beginf := -1.23;
p := @f;s := IntToHex(PInteger(p)^, 4);
end;结果被存放在一个字符串内,而且高低字节没有反。