//假设我有一个已知的a
byte[] a = { 1,2,3,4,5,6,7,8,9 };
//规则是这样,每隔4个我要加“ 后面长度,0,0,0}
//目标是搞成 b
byte[] b = { 4, 0, 0, 0, 1, 2, 3, 4, 4, 0, 0, 0, 5, 6, 7, 8, 1, 0, 0, 0, 9 };
//我应该怎么弄。。。最好敲点代码提醒一下
12 个解决方案
#1
现在不明白如何 在一个 byte[] 里插入 x,0,0,0 ....
#2
用List随便你插
#3
?求指导。。
#4
byte[] getbytes(byte[] bytes)
{
try
{
var remainder = bytes.Count() % 4; //1
var divtime = bytes.Count() / 4; //2
if (remainder != 0)
{
var lstbytes = new List<byte[]>();
for (int i = 0; i < divtime; i++)
{
var bys = bytes.Skip(i * 4).Take(4).ToArray();
var b = new byte[] { 4, 0, 0, 0 };
lstbytes.Add(b);
lstbytes.Add(bys);
}
var tmpBytes = bytes.Skip(divtime * 4).Take(remainder).ToArray();
var otherbytes = new byte[] { (byte)tmpBytes.ToList().Count(), 0, 0, 0 };
lstbytes.Add(otherbytes);
lstbytes.Add(tmpBytes);
return lstbytes.SelectMany(P => P).ToArray();
}
else
{
var lstbytes = new List<byte[]>();
for (int i = 0; i < divtime; i++)
{
var tmpbys = bytes.Skip(i * 4).Take(4).ToArray();
var otherbytes = new byte[] { 4, 0, 0, 0 };
lstbytes.Add(otherbytes);
lstbytes.Add(tmpbys);
}
return lstbytes.SelectMany(P => P).ToArray();
}
}
catch (Exception ex)
{
return new byte[] { };
}
}
byte[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var targetbytes = getbytes(a);
#5
可以吧函数里面的4 写成参数,但是调用之前要判断参数不能为0,除数不能为0,,代码还有可以优化的地方,暂时能满足你使用
#6
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
byte[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[] result = a.Select((x, i) => new { x, i })
.GroupBy(x => x.i / 4)
.SelectMany(x => new byte[] { (byte)x.Count(), 0, 0, 0 }.Concat(x.Select(y => y.x)))
.ToArray();
Console.WriteLine(string.Join(", ", result.Select(x => x.ToString())));
}
}
}
4, 0, 0, 0, 1, 2, 3, 4, 4, 0, 0, 0, 5, 6, 7, 8, 1, 0, 0, 0, 9
请按任意键继续. . .
#7
你应该揍他一顿
都什么破规则
协议做的太烂了
都什么破规则
协议做的太烂了
#8
ls的不错,
#9
我就是个打酱油的。
#10
#11
用linq,或者循环自己做,都不复杂。
不过你们这个协议确实。。。
不过你们这个协议确实。。。
#12
有点明白楼主的意思了
他们的协议是头4字节长度,
这个很好整,用list 先添加长度
再将协议体添加进去.
List<byte> vvv = new List<byte>(300);
//长度
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(0).Take(4));
//协议二
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(4).Take(4));
他们的协议是头4字节长度,
这个很好整,用list 先添加长度
再将协议体添加进去.
List<byte> vvv = new List<byte>(300);
//长度
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(0).Take(4));
//协议二
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(4).Take(4));
#1
现在不明白如何 在一个 byte[] 里插入 x,0,0,0 ....
#2
用List随便你插
#3
?求指导。。
#4
byte[] getbytes(byte[] bytes)
{
try
{
var remainder = bytes.Count() % 4; //1
var divtime = bytes.Count() / 4; //2
if (remainder != 0)
{
var lstbytes = new List<byte[]>();
for (int i = 0; i < divtime; i++)
{
var bys = bytes.Skip(i * 4).Take(4).ToArray();
var b = new byte[] { 4, 0, 0, 0 };
lstbytes.Add(b);
lstbytes.Add(bys);
}
var tmpBytes = bytes.Skip(divtime * 4).Take(remainder).ToArray();
var otherbytes = new byte[] { (byte)tmpBytes.ToList().Count(), 0, 0, 0 };
lstbytes.Add(otherbytes);
lstbytes.Add(tmpBytes);
return lstbytes.SelectMany(P => P).ToArray();
}
else
{
var lstbytes = new List<byte[]>();
for (int i = 0; i < divtime; i++)
{
var tmpbys = bytes.Skip(i * 4).Take(4).ToArray();
var otherbytes = new byte[] { 4, 0, 0, 0 };
lstbytes.Add(otherbytes);
lstbytes.Add(tmpbys);
}
return lstbytes.SelectMany(P => P).ToArray();
}
}
catch (Exception ex)
{
return new byte[] { };
}
}
byte[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var targetbytes = getbytes(a);
#5
可以吧函数里面的4 写成参数,但是调用之前要判断参数不能为0,除数不能为0,,代码还有可以优化的地方,暂时能满足你使用
#6
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
byte[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[] result = a.Select((x, i) => new { x, i })
.GroupBy(x => x.i / 4)
.SelectMany(x => new byte[] { (byte)x.Count(), 0, 0, 0 }.Concat(x.Select(y => y.x)))
.ToArray();
Console.WriteLine(string.Join(", ", result.Select(x => x.ToString())));
}
}
}
4, 0, 0, 0, 1, 2, 3, 4, 4, 0, 0, 0, 5, 6, 7, 8, 1, 0, 0, 0, 9
请按任意键继续. . .
#7
你应该揍他一顿
都什么破规则
协议做的太烂了
都什么破规则
协议做的太烂了
#8
ls的不错,
#9
我就是个打酱油的。
#10
#11
用linq,或者循环自己做,都不复杂。
不过你们这个协议确实。。。
不过你们这个协议确实。。。
#12
有点明白楼主的意思了
他们的协议是头4字节长度,
这个很好整,用list 先添加长度
再将协议体添加进去.
List<byte> vvv = new List<byte>(300);
//长度
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(0).Take(4));
//协议二
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(4).Take(4));
他们的协议是头4字节长度,
这个很好整,用list 先添加长度
再将协议体添加进去.
List<byte> vvv = new List<byte>(300);
//长度
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(0).Take(4));
//协议二
vvv.AddRange(BitConverter.GetBytes(4))
//协议体
vvv.AddRange(a.Skip(4).Take(4));