我有一个浮点值 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 个字节,Byte0
、Byte1
和 Byte2
。
关于c# - 将浮点值转换为 24 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50500935/