c# - 将浮点值转换为 24 位

标签 c#

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

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

我需要将此数据发送到只接受此格式数据的协议(protocol)。

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

如有任何帮助,我们将不胜感激。

在社区的帮助下更新

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

  • 问题是没有 24 位 float ,我发现如果我们将其设为 24 位(用户类),这些位将如何排列。

  • 我会通过UDP发送

  • 我不知道比特需要以什么顺序发送

更新

它是双源

最佳答案

基于其他response我告诉过你,唯一的问题就是将 Int32 截断为 Int24。最简单的方法是使用返回 byte[4]BitConverter.GetBytes(int) 然后删除最后一个 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;
}

现在,Int24 结构有 3 个字节,Byte0Byte1Byte2

关于c# - 将浮点值转换为 24 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50500935/

相关文章:

c# - 使用泛型接口(interface)的 WCF RESTful 服务

c# - 如何仅使用获取访问器绑定(bind)到属性

c# - 找不到 MySql 库

c# - WPF:如何高效地每秒更新图像 30 次

c# - 使用 SqlCommand 参数时调用 SQL 函数要慢得多

c# - 为什么不能将成员方法传递给基类构造函数?

c# - 具有相同名称的多个内存数据库

c# - 无法访问 System.Windows 命名空间

c# - Unity 根据设备方向自动旋转屏幕对象

c# - 什么是 VS2013 中的 LinqToXsdSchema 构建操作?