如何有效地填充字节数组
Posted
技术标签:
【中文标题】如何有效地填充字节数组【英文标题】:How do I left pad a byte array efficiently 【发布时间】:2014-09-21 14:38:34 【问题描述】:假设我有一个数组
LogoDataBy
byte[0x00000008]
[0x00000000]: 0x41
[0x00000001]: 0x42
[0x00000002]: 0x43
[0x00000003]: 0x44
[0x00000004]: 0x31
[0x00000005]: 0x32
[0x00000006]: 0x33
[0x00000007]: 0x34
我想创建一个任意长度的数组并用0x00
填充它
newArray
byte[0x00000010]
[0x00000000]: 0x00
[0x00000001]: 0x00
[0x00000002]: 0x00
[0x00000003]: 0x00
[0x00000004]: 0x00
[0x00000005]: 0x00
[0x00000006]: 0x00
[0x00000007]: 0x00
[0x00000008]: 0x41
[0x00000009]: 0x42
[0x0000000a]: 0x43
[0x0000000b]: 0x44
[0x0000000c]: 0x31
[0x0000000d]: 0x32
[0x0000000e]: 0x33
[0x0000000f]: 0x34
我这里有我当前的 sn-p
string test = "ABCD1234";
byte[] LogoDataBy = ASCIIEncoding.ASCII.GetBytes(test);
var newArray = new byte[16];
var difference = newArray.Length - LogoDataBy.Length;
for (int i = 0; i < LogoDataBy.Length; i++)
newArray[difference + i] = LogoDataBy[i];
有没有更有效的方法来做到这一点?
【问题讨论】:
是的 - 如果你真的需要高效,请使用Array.Copy
或 Buffer.BlockCopy
【参考方案1】:
我建议像这样以Array.Copy
开头:
string test = "ABCD1234";
byte[] LogoDataBy = ASCIIEncoding.ASCII.GetBytes(test);
var newArray = new byte[16];
var startAt = newArray.Length - LogoDataBy.Length;
Array.Copy(LogoDataBy, 0, newArray, startAt, LogoDataBy.Length);
如果你真的需要速度,你也可以Buffer.BlockCopy
:
string test = "ABCD1234";
byte[] LogoDataBy = ASCIIEncoding.ASCII.GetBytes(test);
var newArray = new byte[16];
var startAt = newArray.Length - LogoDataBy.Length;
Buffer.BlockCopy(LogoDataBy, 0, newArray, startAt, LogoDataBy.Length);
请注意,我没有检查您提供的数组的长度 - 您应该注意它是否足够大。
【讨论】:
从您的回答开始,我编写了一个参数函数来执行此操作。链接在这里:programmingistheway.wordpress.com/2016/02/24/…【参考方案2】:根据您如何定义“更高效”,这可能是值得的:
var newArray =
Enumerable
.Repeat<Byte>(0, 16 - LogoDataBy.Length)
.Concat(LogoDataBy)
.ToArray();
这在计算上可能效率不高,但就使代码清晰和可维护而言,您可能会认为这是一种高效的编码方式。
【讨论】:
如果我正在编写网络代码,我会更喜欢@Carsten 的回答。如果我正在编写应用程序级程序,我会更喜欢你的方法。 为什么不var newArray = new byte[16 - LogoDataBy.Length].Concat(LogoDataBy).ToArray();
?【参考方案3】:
您可以使用其他一些GetBytes
的重载。其中之一允许您指定数组中的起始索引:http://msdn.microsoft.com/en-us/library/595a8te7%28v=vs.110%29.aspx
您可以在编码类上使用GetByteCount
方法来获取编码后将存在的字节数,尽管添加此额外调用可能会抵消任何性能优势。您可能知道字节数与字符串长度完全匹配(取决于您的字符串源)。
【讨论】:
以上是关于如何有效地填充字节数组的主要内容,如果未能解决你的问题,请参考以下文章