. Net'in bir bayt dizisine dönüştürmek için kullanabileceği bir tür kolay dönüştürme yöntemi olduğunu düşündüm. Ben hızlı bir arama yaptım ve tüm çözümler "iyi ol gün" gibi bir seferde bir bayt maskeleme/kaydırma vardır. Bir yerde ToByteArray() yöntemi yok mu?A'dan Z'ye bayt dizisi
cevap
byte[] bytes = BitConverter.GetBytes(i);
notu rağmen ayrıca o etrafında hangi yolu ortaya çıkacaktı görmek için BitConverter.IsLittleEndian
kontrol etmek isteyebilirsiniz! Tekrar tekrar bu yapıyoruz eğer, ya unsafe
kodu kullanarak ya vardiya işlemleri (>>
/<<
) üzerinden kendiniz yazarak tüm bu kısa ömürlü dizisi tahsisleri önlemek isteyebileceği
Not. Vardiya işlemleri ayrıca platformunuzun endianitesinden etkilenmeme avantajına sahiptir; Eğer hep beklemediğiniz sırayla bayt olsun.
Marc'ın cevabı elbette doğru cevaptır. Ancak, vardiyalı operatörleri ve güvensiz kodu alternatif olarak belirttiği için. Daha az yaygın bir alternatifi paylaşmak istiyorum. düzeniyle bir yapı kullanma. Bu prensip olarak bir C/C++ union
'a benzer.
Burada, Int32 veri türünün bileşen baytlarına ulaşmak için kullanılabilecek bir yapı örneği ve güzel olan iki yol olduğu, bayt değerlerini değiştirebildiğiniz ve Int . Eğer seri halinde yukarıda şimdi olarak kullanılabilir
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct Int32Converter
{
[FieldOffset(0)] public int Value;
[FieldOffset(0)] public byte Byte1;
[FieldOffset(1)] public byte Byte2;
[FieldOffset(2)] public byte Byte3;
[FieldOffset(3)] public byte Byte4;
public Int32Converter(int value)
{
Byte1 = Byte2 = Byte3 = Byte4 = 0;
Value = value;
}
public static implicit operator Int32(Int32Converter value)
{
return value.Value;
}
public static implicit operator Int32Converter(int value)
{
return new Int32Converter(value);
}
}
Tabii
Int32Converter i32 = 256;
Console.WriteLine(i32.Byte1);
Console.WriteLine(i32.Byte2);
Console.WriteLine(i32.Byte3);
Console.WriteLine(i32.Byte4);
i32.Byte2 = 2;
Console.WriteLine(i32.Value);
değişmezlik polisi geçtiğimiz olasılıkları :)
+ 1: Bu güzel bir yaklaşım. Değişkenlik polisi için endişeleniyorsanız, alanları özel hale getirebilir ve bunları yalnızca özelliklerle gösterebilirsiniz. – Ani
@Ani, Teşekkürler, bu byte üyeleri özel yapmak ve get-only özellikleri oluşturmak için iyi bir fikirdir. –
'Byte1 = Byte2 = Byte3 = Byte4 = 0;' ifadesi. Sonraki Değer ataması, bunların üzerine yazdıkça gereksizdir. Bu, derleyici optimizasyon yazarları somunlarını yönlendiren tam olarak bir tür takma addır. Birlik, çoklu yazışmaları bellek kanalı üzerinden tek bir noktaya daralttığından zariftir. Yapıyı kullanmak, çok sık durumlar için dizi ayırmayı da engeller. – Pekka
Bu OT olabilir ama heyecan olmayabilir aşağıdaki Bir çok ilkel tip veya POD yapısı, Google Protocol Buffers for .Net sizin için yararlı olabilir. Bu, diğer kullanışlı özelliklerin yanı sıra yukarıda yükseltilen @Marc'e de değiniyor.
burada cevapların çoğu 'güvensiz" ya da değil littleEndian güvenli alınarak belirlenir. BitConverter güvenli littleEndian değildir. Yani basitçe okuyarak bir littleEndian güvenli versiyonu yapılmış (PZahra tarafından yazılan bakınız) here bir örnek üzerinde inşa .
bayt dizisi girdi tam hex olanTrue
0xDCBAABCDFFFE1608
01: ters bayt dizisi BitConverter.IsLittleEndian ==
void Main(){
Console.WriteLine(BitConverter.IsLittleEndian);
byte[] bytes = BitConverter.GetBytes(0xdcbaabcdfffe1608);
//Console.WriteLine(bytes);
string hexStr = ByteArrayToHex(bytes);
Console.WriteLine(hexStr);
}
public static string ByteArrayToHex(byte[] data)
{
char[] c = new char[data.Length * 2];
byte b;
if(BitConverter.IsLittleEndian)
{
//read the byte array in reverse
for (int y = data.Length -1, x = 0; y >= 0; --y, ++x)
{
b = ((byte)(data[y] >> 4));
c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30);
b = ((byte)(data[y] & 0xF));
c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30);
}
}
else
{
for (int y = 0, x = 0; y < data.Length; ++y, ++x)
{
b = ((byte)(data[y] >> 4));
c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30);
b = ((byte)(data[y] & 0xF));
c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30);
}
}
return String.Concat("0x",new string(c));
}
doğru Bu döndüğünde
bir int olsa da. Bahsetmemek gerekirse, _read_'deki bu endianness kontrolünü yapmak çok daha mantıklıdır, dolayısıyla verilerinizin dizideki gibi olduğundan eminsiniz. – Nyerguds
- 1. Bayt dizisi içinde bayt dizisi bul
- 2. geçersiz bayt dizisi
- 3. hardcode bayt dizisi C
- 4. ZF2 Bayt dizisi ile akış
- 5. Python 3 Bayt dizisi oluşturma
- 6. C#: XML'de bayt dizisi sakla
- 7. VB.NET'te bir bayt dizisi bildirme
- 8. 2 bayt UTF-8 dizisi için geçersiz bayt 2
- 9. Boyer-Moore-Horspool Algoritması (Bayt dizisi içindeki bayt dizisinin bul)
- 10. XML'de blob veya bayt dizisi gönderme
- 11. Bir bayt dizisi (.docx dosyasından oluşturuldu) ABCPDF
- 12. System.arrayCopy() yöntemi yerine java'da bayt dizisi birleştirilir.
- 13. Java'da bir bayt dizisi nasıl bölülür?
- 14. Bir sınırlayıcıda bir bayt dizisi bölme
- 15. Android: Bitmap'e bayt dizisi nasıl dönüştürülür?
- 16. Bayt dizisi boş olarak nasıl kontrol edilir?
- 17. Paypal IPN: Geçersiz bayt dizisi UTF-8
- 18. Doğrudan bayt dizisi pdf biçimine dönüştürmek için docx biçimindeki bayt dizisini dönüştürün
- 19. Js dosyasında zincir kodlaması hatası: geçersiz UTF-8 bayt dizisi
- 20. Bir çeşit Java/Scala görüntüsüne bayt dizisi. Performansla ilgili düşünceler
- 21. HttpClient gönderme xml seri hale getirilmiş bayt dizisi
- 22. Görüntü Glide kullanarak bayt dizisi aracılığıyla nasıl yüklenir?
- 23. PdfBox'u kullanarak, PDDocument öğelerini bir bayt dizisi olarak nasıl alabilirim?
- 24. C# hashed bayt dizisi API'ye geçmek için dizeye nasıl dönüştürülür?
- 25. C# cinsinden sabit boyutlu bayt dizisi kullanıcı türünü nasıl yapabilirim?
- 26. Postgresql PHP kodlama için geçersiz bayt dizisi UTF8
- 27. Java/Android: Bir yuva üzerinde bir bayt dizisi okuma/yazma
- 28. Windows dışı bir bayt dizisi :: Storage :: Streams :: IBuffer
- 29. PGError: ERROR: "UTF8 kodlamak için geçersiz bayt dizisi
- 30. paket yükleme hatası "US-ASCII geçersiz bayt dizisi (ArgumentError)"
+1: Açıklık açısından, "[...]" büyük-endian "ile" onları beklediğiniz sırada "yerine koyuyorum. – Ani
Neden 'BitConverter.GetBytes (250)' '[250,0,0,0]' döndürür ve '[250]' değil? 'Byte.MaxValue == 255', değil mi? 4 byte ve CPU little-endian, öyleyse siz - –
@Tobi aradığınız çünkü GetBytes (int). GetBytes (byte) yönteminde bir amaç olmaz. –