4 Answers
4

I think this would be more appropriate (though it depends on how d is used):

byte[] des16 = new byte[16];
IEnumerable<byte> d = des16.Skip(8);

Using pure managed code, you cannot use pointers to locations. Since d takes a pointer to the 8th element of the array, the closest analog would be creating an enumeration of des16 skipping the first 8 items. If you are just iterating through the items, this would be the best choice.

I should also mention that Skip() is one of many extension methods available for arrays (and other IEnumerables) in .Net 3.5 (VS2008/VS2010) and up which I could only assume you were using. You wouldn't be able to use it if you are using .Net 2.0 (VS2003/VS2005).

If d is used to access the offset elements in des16 like an array, it could be converted to an array as well.

byte[] d = des16.Skip(8).ToArray();

Note this creates a separate instance of an array which contains the items in des16 excluding the first 8.

Otherwise it's not completely clear what the best use would be without seeing how it is used.

[edit]

It appears you are working with null-terminated strings in a buffer in .Net 2.0 possibly (if Skip() isn't available). If you want the string representation, you can convert it to a native string object.