Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';向字节数组中添加零字节的最简单方法是什么?_C# - Fatal编程技术网

C# 什么';向字节数组中添加零字节的最简单方法是什么?

C# 什么';向字节数组中添加零字节的最简单方法是什么?,c#,C#,我正在将一个byte[]转换为biginger,我想确保它是正数: 为了防止正值被误解为负值,可以在数组末尾添加一个零字节值 但它没有具体说明如何。那么,我该怎么做呢 发现这是最简单的: public static BigInteger UnsignedBigInt(byte[] bytes) { if ((bytes[bytes.Length - 1] & 0x80) != 0) Array.Resize(ref bytes, bytes.Length + 1); r

我正在将一个
byte[]
转换为
biginger
,我想确保它是正数:

为了防止正值被误解为负值,可以在数组末尾添加一个零字节值

但它没有具体说明如何。那么,我该怎么做呢


发现这是最简单的:

public static BigInteger UnsignedBigInt(byte[] bytes)
{
    if ((bytes[bytes.Length - 1] & 0x80) != 0) Array.Resize(ref bytes, bytes.Length + 1);
    return new BigInteger(bytes);
}

我想这一页的底部已经解释过了。请看一下样品:


ulong originalNumber = UInt64.MaxValue;
byte[] bytes = BitConverter.GetBytes(originalNumber);
if (originalNumber > 0 && (bytes[bytes.Length - 1] & 0x80) > 0) 
{
   byte[] temp = new byte[bytes.Length];
   Array.Copy(bytes, temp, bytes.Length);
   bytes = new byte[temp.Length + 1];
   Array.Copy(temp, bytes, temp.Length);
}

BigInteger newNumber = new BigInteger(bytes);
Console.WriteLine("Converted the UInt64 value {0:N0} to {1:N0}.", 
                  originalNumber, newNumber);
请注意,此代码是从MSDN站点复制的,用于说明如何处理在转换为BigInt期间可能被视为负数的大数字。说到效率,这并不是你能得到的最好结果,而且在这个线程中提供了更好的代码片段。

试试这个:

byte[] bytes = ...

if ((bytes[bytes.Length - 1] & 0x80) != 0)
{
    Array.Resize<byte>(ref bytes, bytes.Length + 1);
}

BigInteger result = new BigInteger(bytes);
byte[]bytes=。。。
if((字节[bytes.Length-1]&0x80)!=0)
{
Array.Resize(ref字节,bytes.Length+1);
}
BigInteger结果=新的BigInteger(字节);

使用静态方法System.Array.Resize。就你而言:

byte[] b = Guid.NewGuid().ToByteArray();
System.Array.Resize<byte>(ref b, b.Length + 1);
b[b.Length - 1] = 0;
byte[]b=Guid.NewGuid().ToByteArray();
系统.数组.调整大小(参考b,b.长度+1);
b[b.长度-1]=0;
单向:

var x = BigInteger.Abs(new BigInteger(bytes));

这似乎非常简单:

var bytesAfter = bytesBefore.Concat(new byte[] { 0 }).ToArray();

数组来自何处?@SLaks:
Guid.NewGuid().ToByteArray()
这不太可能是个好主意。你可能想要@SLaks:你确定吗?我只关心独特性,而不是猜测的难度。我想我没有向下滚动足够远;我还是希望是一行。@Mark:代码的质量与所需的行数没有任何关系。“希望使用一行程序”是浪费时间。@EdS.不,不是,但我必须将其提取到一个方法中以保持其干净,然后我必须决定是否要创建一个新的静态类来处理二进制数据,等等,当我只需要一件小事的时候。然后你的整个项目就会被小助手方法弄得乱七八糟。。。不管是对是错,有时候我喜欢把事情安排得很紧。@Mark:听起来对我来说并不是什么大问题。把它放在一个静态类中,放在其他地方,随便什么;它会起作用,在实践中不会成为问题,您可以跳过它继续解决实际问题。@EdS:是的,代码的质量与行数没有直接关系。但在这种情况下,代码糟糕得离谱(复制数组两次),而不是简单地调用
array.Resize
。这真的是一条直线。我想过,但现在你创造了可能的碰撞。(即,两个不同字节数组的数字相同),但您说您一直希望它为正数。因此,假设一个1字节的数组0x00和0x80都被视为零。这是行不通的。如果设置了高阶位,它将数字解释为两个补码。因此,这样做会将(例如)biginger.Abs(新的biginger(新的字节[]{255})解释为1,因为biginger将返回-1。可能OP希望255不是1。:)还请注意,biginger(字节[])希望数组应该是小端顺序的,从最低顺序的字节到最高顺序的字节。和Guid.ToByteArray()不说明字节顺序!不,我不是说取绝对值,我是说,如果你只关心唯一值,-1和1是唯一的…请注意,没有必要指定最后的0字节,因为这是
Resize
@Gabe创建的默认值:它没有在Array.Resize的帮助中指定。帮助说明“如果newSize大于旧数组的长度,则会分配一个新数组,并将所有元素从旧数组复制到新数组中。”创建新数组时,所有元素都以值
default(T)
开始。由于它不指定oldSize以外的元素会发生什么,因此它们保留为
default(T)
,对于
byte
,正好是0。我看到了concat方法,但不喜欢转换为可枚举的返回:)为什么不呢?在我的测试中,将
0
附加到一个百万字节数组只需25毫秒。
var bytesAfter = bytesBefore.Concat(new byte[] { 0 }).ToArray();