我的浮点值为128.523,需要表示为24位2s补码有符号数。
第23位是符号位。 第22至15位是整数部分。 第14位到第0位是浮动部分。
我需要将此数据发送到仅接受此格式数据的协议。
我知道我需要提供我的代码并提出答案,但不幸的是,我完全迷失了如何继续前进。
非常感谢任何帮助。
在社区的帮助下更新
我将从外部设备跟踪数据并将其发送到使用freeD协议的应用程序。我有
没有24Bit浮点问题,我已经知道如果我们将它设置为24位(用户类),将如何排列这些位。
我将通过UDP发送
我不知道这些位需要发送的顺序
更新
是Bigendian
答案 0 :(得分:3)
根据我给你的其他response,唯一的问题是将Int32
定格为Int24
。最简单的方法是使用返回BitConverter.GetBytes(int)
的{{1}},然后删除最后一个byte[4]
...或者我们可以使用一些特殊的byte
,例如:
struct
然后:
[StructLayout(LayoutKind.Explicit)]
struct Int32ToBytes
{
[FieldOffset(0)]
public int Int32;
[FieldOffset(0)]
public uint Uint32;
[FieldOffset(0)]
public byte Byte0;
[FieldOffset(1)]
public byte Byte1;
[FieldOffset(2)]
public byte Byte2;
[FieldOffset(3)]
public byte Byte3;
}
public struct Int24
{
public byte Byte0;
public byte Byte1;
public byte Byte2;
}
现在,private const int minSrc = 0x5A0000;
private const int maxSrc = 0xA60000;
private const double minDest = -180.0;
private const double maxDest = 180.0;
private const double rangeDest = maxDest - minDest;
public static Int24 ConvertToInt24(double num)
{
int res = (int)(((num - minDest) * rangeSrc / rangeDest) + minSrc);
var conv = new Int32ToBytes { Int32 = res };
var res2 = new Int24
{
Byte0 = conv.Byte0,
Byte1 = conv.Byte1,
Byte2 = conv.Byte2,
};
return res2;
}
结构有3个字节,Int24
,Byte0
和Byte1
。