【问题标题】:Combine two ulong values and convert it to byte array合并两个 ulong 值并转换为字节数组
【发布时间】:2015-06-10 12:58:50
【问题描述】:

我有一个问题,我一整天都无法解决。我是 C# 的新手,请您帮帮我。

我有两个 ulong 值。我需要结合它们的二进制表示并获得 16 个字节的值。我知道 C# 不支持 128 位类型。但我也不需要将这个值保存在变量中。我需要将此值转换为字节数组。 我试图组合这样的值:

long a = ((long)b << 64) + (long)c;

然后使用 BitConverter 转换为字节数组。

但我意识到这是不正确的,因为 long 值的大小是 8 字节。 我不想创建 128 类型来获取结果。

那么有没有办法直接组合并添加到字节数组中?

谢谢

【问题讨论】:

  • BitConverter 可以从偏移量的字节数组中读取,但不幸的是没有任何函数可以写入字节数组中的偏移量:(

标签: c# arrays byte


【解决方案1】:

我猜它的作业? 您可以将您的术语、ulongs a 和 b 表示为字节数组。 之后,您可以为总和创建一个新的字节数组 c。 对于每个字节逐位进行,只需执行正常的二进制补码二进制加法,请记住字节之间的进位。 如果最后一个字节有进位,那么你应该抛出某种“ulong 加法溢出异常”。

【讨论】:

    【解决方案2】:

    Microsoft C# 支持任意长度的整数,使用 BigInteger。您可以结合您的两个值,例如在您给出的示例中,如下所示:

    BigInteger a = b;
    a <<= 64;
    a += c;
    

    但是,正如您所指出的,您不需要存储此值。在你提到之前,是的,我知道字节序。存在依赖于机器的字节序和线上字节序。我们不应该尝试产生任何与机器相关的字节序......我们可以在我最熟悉的语言中产生在线字节序的方式是使用右移和模运算符,至少对于无符号类型。有符号类型引入了对符号进行编码的复杂性,但这里有一个我认为您可能会从中受益的示例:

    byte[] array = { (byte)(b >> 56), (byte)(b >> 48), (byte)(b >> 40), (byte)(b >> 32),
                     (byte)(b >> 24), (byte)(b >> 16), (byte)(b >>  8), (byte)(b      ),
                     (byte)(c >> 56), (byte)(c >> 48), (byte)(c >> 40), (byte)(c >> 32),
                     (byte)(c >> 24), (byte)(c >> 16), (byte)(c >>  8), (byte)(c      ) };
    

    【讨论】:

    • 看来这是我需要的...谢谢。但是你知道如何在 pl sql 中得到同样的结果吗?我需要比较结果。
    • 很好。我打算表达对我的代码缺乏完全的信心。感谢您的建议,@BenVoigt。你还有什么建议吗?
    • 太棒了。 @stilhead 那是另一个问题,我没有答案......
    【解决方案3】:

    如果我运行这个:

    var x = (ulong)1;
    var y = (ulong)2;
    
    var result =
        BitConverter.GetBytes(x)
            .Concat(BitConverter.GetBytes(y))
            .ToArray();
    

    我明白了:

    这是你想要的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多