【问题标题】:Concatenate two int into a byte array - Is there a one line implementation? [duplicate]将两个 int 连接成一个字节数组 - 是否有单行实现? [复制]
【发布时间】:2021-06-13 18:34:54
【问题描述】:

我想以大端方式将两个 32 位值添加到 byte[8]

int a = 1; // => [ 0, 0, 0, 1]
int b = 2; // => [ 0, 0, 0, 2]

导致

[0, 0, 0, 1, 0, 0, 0, 2]

那么,唯一的衬线是什么?

到目前为止我的方法是

int a = 1;
int b = 2;

byte[] array = new byte[] { };
array = array.Concat(BitConverter.GetBytes(a)).ToArray();
array = array.Concat(BitConverter.GetBytes(b)).ToArray();

所以这已经足够复杂了,但是小端。所以我会为每个int 添加一行以将它们反转。

python 中的两个对话:

a = 1;
b = 2;
array = a.to_bytes(4, 'big') + b.to_bytes(4, 'big')

C# 方法是什么?

【问题讨论】:

  • 嗯,您自己的一些选择有点奇怪。 IE。不清楚为什么你不只是有var array = BitConverter.GetBytes(a).Concat(BitConverter.GetBytes(b)).ToArray() 而不是例如首先创建一个空数组并存储一个中间形式,其中仅将 a 添加到数组中。在 Python 版本中,您似乎没有做同样的事情......
  • (a
  • 如果您在项目中可以访问 dotNET 3.1,则会有一个新的 BinaryPrimitives 库。
  • 这能回答你的问题吗? C# int to byte[]this 回答。
  • 小心使用 2'scompliment 符号扩展的负数。你的号码是有符号还是无符号?

标签: c# arrays


【解决方案1】:

BitConverter 字节序取决于它所执行的平台,因此您必须检查BitConverter.IsLittleEndian 并对来自BitConverter.GetBytes(a) 的结果进行一些有条件的.Reverse()-ing。

byte[] array = (BitConverter.IsLittleEndian ?
  BitConverter.GetBytes(a).Reverse().Concat(BitConverter.GetBytes(b).Reverse()) : 
  BitConverter.GetBytes(a).Concat(BitConverter.GetBytes(b))
).ToArray();

(我不一定会按照您的要求将其作为单行代码,但您可以从这个示例中创建具有更经济语法的有用函数。)

【讨论】:

  • 感谢您的输入。好吧,不,我不会仅仅为了实现一个衬里就强迫它变成一个衬里。对于一个衬里,我肯定只是指一个简短而漂亮的解决方案(如在 python 中)。那么您的解决方案将违反我们的“一行最多 150 个符号”政策:-)
猜你喜欢
  • 2012-09-29
  • 2018-05-10
  • 2021-09-20
  • 2022-06-17
  • 1970-01-01
  • 2021-05-19
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多