将浮点值转换为24位

时间:2018-05-24 04:22:32

标签: c#

我的浮点值为128.523,需要表示为24位2s补码有符号数。

第23位是符号位。 第22至15位是整数部分。 第14位到第0位是浮动部分。

我需要将此数据发送到仅接受此格式数据的协议。

我知道我需要提供我的代码并提出答案,但不幸的是,我完全迷失了如何继续前进。

非常感谢任何帮助。

在社区的帮助下

更新

  • 我将从外部设备跟踪数据并将其发送到使用freeD协议的应用程序。我有

  • 没有24Bit浮点问题,我已经知道如果我们将它设置为24位(用户类),将如何排列这些位。

  • 我将通过UDP发送

  • 我不知道这些位需要发送的顺序

更新

是Bigendian

1 个答案:

答案 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个字节,Int24Byte0Byte1