【问题标题】:How to convert a double to an arbitrary-size byte array?如何将双精度转换为任意大小的字节数组?
【发布时间】:2015-12-08 19:30:57
【问题描述】:

我正在 C# 中开展一个项目,我必须使用 字节数组 提取数据一个名为 ASTERIX 的开源协议。修改数据后,我想对它们进行编码并再次基于协议将其放入 字节数组 中。我的问题是,在某些时候我需要将双精度转换为字节数组。根据协议,这个字节数组应该是 3 个字节(3 个八位字节),而我在转换后得到的字节数组是 8 个字节。是否有任何内置函数可用于将双精度转换为 3 字节字节数组? 另外,对于我拥有的 double 值,3 字节绝对足够了。如果有帮助,我这里有一些代码:

double val = 32673.6953125;
byte[] brokenBytes = BitConverter.GetBytes(doubleValue);;

【问题讨论】:

  • 一个 double 有 8 个字节的数据。您希望如何将这些数据存储在 3 个字节中?这将是有损的,您需要告诉我们格式。
  • @usr 你是完全正确的。完全忘记了双人床的大小。您能告诉我您想要的格式是什么吗?
  • 你打算怎么把8个字节变成3个?
  • @usr 当我查看一些转换为字节的值时,看起来我可以得到一个索引值并将其添加到另一个索引值,只要它低于 255。但是然后我意识到:1)它改变了原来的值 2)不可能对其他双精度值做同样的事情。但也许你可以帮我解决这个问题:使用BitConverter 类是将值转换为字节数组的正确方法吗?
  • 这是正确的方法,但在您清楚如何将 8 个字节放入 3 之前,这将一事无成。

标签: c# bytearray data-conversion


【解决方案1】:

我发现由于 double 至少需要 8 个字节,因此; 不可能在不损失精度和损害原始值的情况下将 double 转换为任意大小的字节数组(换句话说:将其压缩为小于 8 字节的字节数组)

额外信息: 对于任何感兴趣的人,在阅读了有关 ASTERIX 协议的文档后,我意识到我需要通过给定的算法来处理值。然后,该算法可以将该值存储为 3 字节 (3-OCTET) 数据。 我需要处理的具体数据称为Time Of Track Information。 这是一个简单的解决方案:

private double PrepareElapsedTimeSinceMidnightForEncodeing(double value, int numberOfDivisionBy2)
    {
        value *= 128;

        value /= Math.Pow(2, numberOfDivisionBy2);

        MainDataStorage.NumberOfDivisionBy2 = 0;

        return value;
    }

有关 ASTERIX 协议的更多信息,请访问:ASTERIX | Eurocontrol

【讨论】:

  • 理想情况下,整个信息应该作为问题的一部分!
  • @Adarsha 我现在就去做。对不起
  • 数组在哪里,如“如何将双精度数转换为任意大小的字节数组?
  • @Roy 正如 usr 在 cmets 中提到的那样,double 需要 8 字节,并且您不能将其强制转换为小于 8 字节的数组。我的想法是(听起来很愚蠢)获取索引中的值,并尝试找到另一个索引。如果它们的总和小于 255,我会将这两个值的总和移动到一个索引中(例如图像中的 index3+index4)。但这永远行不通。
  • @Roy 你是绝对正确的。忘记了一个简单的事实,即 double 需要 8 个字节,这让我想到了这个问题。我不确定如何以正确的方式回答这个问题。也许我只需要提及我不可能在不损失精度和损害原始价值的情况下做到这一点?我愿意接受你的任何建议:)
猜你喜欢
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2014-11-02
  • 2010-11-21
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2011-02-23
相关资源
最近更新 更多