我如何有效地左垫一个字节数组
本文关键字:一个 字节 数组 字节数 有效地 | 更新日期: 2023-09-27 18:15:38
假设我有一个数组
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
我的当前代码段在这里
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
开始:
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);
请注意,我没有检查您提供的数组的长度-您应该注意它足够大
这取决于你如何定义"更高效",那么这可能值得这样做:
var newArray =
Enumerable
.Repeat<Byte>(0, 16 - LogoDataBy.Length)
.Concat(LogoDataBy)
.ToArray();
这可能不会在计算上更有效率,但在使代码清晰和可维护方面,您可能会认为这是一种有效的编码方式。
您可以使用GetBytes
的其他一些重载。其中之一允许您在数组中指定起始索引:http://msdn.microsoft.com/en-us/library/595a8te7%28v=vs.110%29.aspx
您可以在编码类上使用GetByteCount
方法来获得编码后存在的字节数,尽管添加这个额外的调用可能会抵消任何性能优势。您可能知道字节数与字符串长度完全匹配(取决于您的字符串源)。