Aslında bir bayt akışı nedir?


34

Herhangi biri bana, bayt akışının gerçekte ne içerdiğini açıklayabilir mi? Yalnızca bayt (onaltılık veri) veya ikili veri veya yalnızca ingilizce harfler içeriyor mu? Ayrıca "ham veri" terimi konusunda kafam karıştı. Biri benden "4 bayt veriyi tersine çevirmemi" istedi ise, o zaman verinin hex kodu ya da ikili kod olduğunu varsaymalıyım?


İki sentim cevaplamaya değmez (ve aşağıda zaten iyi olanlar var), ancak sadece "ham verinin" aslında bir şeylere nasıl yorumlandığı hakkında iyi bir fikir verebilecek bu iki makaleye bağlantı vermek istiyorum. neyi temsil etmesi gerektiğini ve nasıl kodlandığını / depolandığını bilmediğiniz sürece herhangi bir şey anlamına gelir. betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael

1
Bence cava, karakter olarak anlaşılamayan şeyler için c / c ++ 'nın karakterini kullanmaktan kaçınmak için yaratılmıştır. char c / c ++ 'da çok kullanılmıştır, çünkü char'ın boyutu 1 byte'dır. Ayrıca, unix içindeki cihazlar blok ve karakter cihazlarıdır. Char aygıtlarından okursanız, işaretsiz karakter / bayt akışını alırsınız.
imel96

Bayt akışı belirsizdir. Octet akışı değil.
Deer Hunter

Veriler birçok düzeyde yorumlanabilir. Alt kısımda sadece bir dizi açma-kapama elektrik seviyesi var. Biraz daha yukarı, bir bayt akışı ya da sizin dediğiniz gibi bir bayt akışı . Daha da yukarı, ham verileri yorumlamaya başlarsınız. Bayt, birçok şekilde metin olarak yorumlanabilir (kodlamalar). Tam sayı sayıları da (büyük veya küçük endian). Daha da yükseğe çıkabilirsin. Bir zip dosyanız var. Bu zip dosyası dünden itibaren sizin yedeğinizdir. Ve bunun gibi. Sorun, kesin seviyenin çoğu zaman örtük olması ve netleştirilmemesidir ve bu kafa karıştırıcı olabilir.
nalply

Yanıtlar:


52

Bayt akışları, baytları içerir. Aslında ne olduğu ile parçalanmış, 1 ve 0'dan oluşan 8 bit. Bir sayıyı temsil ediyor olsaydı, 0'dan 255'e kadar herhangi bir sayı olurdu (ekleyebileceğim, bir IP adresindeki 4 sayının neden her zaman 0'dan 255'e kadar olduğu) tesadüf değil). Bayt akışları genellikle dairesel bir arabellek tutmak için kullanılan temel bayt dizisini gizlemeye yönelik karmaşık arabirimlerdir (arabelleği doldurur ve birinin boşalmasını bekler, bu sırada arabelleği yeniden doldurur).

Bu neyi temsil ediyor? Peki, bir metin dosyasını veya bir görüntüyü veya canlı bir video akışını temsil edebilir. Ne olduğunu okumadan kimin bağlamında üzerine tamamen bağımlıdır. Onaltılık temsil, aynı şeyi söylemenin başka bir yoludur, ancak sayıları değil de onaltılı gösterimleri bakımından baytları yönetmek daha uygun olsa da, aynı şeydir.

Ham verilere atıfta bulunurken, genellikle bayt verilerini kastediyorsunuz. Veriler, "Ben bir resim dosyasıyım!" Yazan bir etiket olmadan gelir. Genelde, yalnızca verilerin genel olarak neyi temsil ettiğini önemsemediğiniz zaman ham verilerle ilgilenirsiniz. Örneğin, bir görüntüyü siyah beyaz sürümüne dönüştürmek istersem, görüntünün ham verilerini ve okunan her 3 bayt için (aslında kırmızı rengin temsili, yeşil rengin temsili ve mavi renk), sayı değerini ekleyin ve 3'e bölün, ardından bu değeri 3 kez yazın. Temelde yaptığım şey bir pikselin kırmızı, yeşil ve mavi değerlerinin ortalamasını almak ve bunun gri eşdeğer pikselini yapmak. Ancak, "bayt bayt" düzeyinde verilere işlem gerçekleştirme hakkında konuştuğunuzda

Veya, belki de bir dosyayı bir veritabanına kaydetmek istersiniz, ancak "ham verilerini" bir blob veri türüne eklemenizi ister. Bu sadece bir dosyanın verilerini veritabanının anlayabileceği ve yönetebileceği büyük bir bayt dizisine dönüştürmek anlamına gelir. Bu değeri veritabanından aldığınızda, başlangıçta veritabanına sağladığınızdan sadece büyük bir bayt dizisi olacağını göreceksiniz. Eğer bu veriler bir dosya ise, o zaman, siz programcı, o dosyayı bir seferde bir byte okuyormuş gibi yeniden yorumlamanız gerekir.

Birisi sizden "4 baytlık verileri tersine çevirmesini" isterse, bunun en büyük veya en küçük anlamlı bayt ile başlayan sayıları yazan, büyük-endian-küçük-endian sayı yorumunu ifade ettiğini varsayardım. Bir sayının büyük harfli veya küçük harfli olarak temsil edilip edilmediği önemli değildir, sadece sayıyı okuyan tüm sistemlerin tutarlı bir şekilde yorumlamaları gerekir.

Bu, gerçek sayı gösteriminin (veya bu konu için onaltılık gösterimin) değiştiği anlamına gelmez, sadece bu 4 baytın sayı yapması sırasının tersine çevrilmesi gerekir. Öyleyse 0x01, 0x02, 0x03 ve 0x04’ünüz olduğunu varsayalım. Bunları tersine çevirmek için 0x04, 0x03, 0x02, 0x01 olur. Sistemin muhtemelen bu 4 baytı ters sırayla okuyacağı ve zaten tersine çevirdiğiniz için, değerin ham verilerde amaçlanan ile aynı olduğu yorumlanır.

Umarım bu açıklar!


Herşey yolunda ..! Lütfen "ham veri" ile ilgili cevabı açıklayabilir misiniz?
user2720323

@ user2720323 Tamam, daha iyi bir "ham veri" açıklamak için değiştirildi. :)
Neil

Akılda tutulması gereken bir şey ... tüm veriler sadece bir bayt koleksiyonudur. Bu baytların anlamı, bir tür meta veri (dosya uzantısı, veritabanı alanı vb.) İle tanımlanır. Bir görüntü dosyası ASCII dosyası olarak yorumlanabilir ve bunun tersi de geçerlidir. Metin veya resim anlamsız olabilir, ancak yine de mümkündür. (Derp ... Sonraki cevapları okumalıydım)
Dave Nay

2
@kevincline Lütfen bir fikir aktarmaya çalıştığımı takdir etmeye çalışın. Önceliğim doğru bir algoritma yazmak değil. Daha doğru olmak istiyorsanız, insan gözünün algılayabildiğine göre kırmızı yeşil ve mavi değerleri tartarsınız.
Neil

18

Bir bayt sadece bir bilgi birimidir - herhangi bir şey olabilir. Bir bayt kendi başına bir anlam ifade etmiyor, ona bir anlam anlamı eklemelisiniz.

Yani, bunu genişletmek için -

Yalnızca bayt (onaltılık veri) veya ikili veri veya yalnızca ingilizce harfler içeriyor mu?

Onaltılı veriler, ikili verilerle aynıdır. Verileri göstermenin farklı bir yolu. Örneğin, 0x41 = 0b01000001 = 'A' = 65 (ondalık). İngilizce harfler bunun sadece bir alt kümesi olurdu.

Biri benden "4 bayt veriyi tersine çevirmemi" istedi ise, o zaman verinin hex kodu ya da ikili kod olduğunu varsaymalıyım?

Onaltılı sadece verilerin bir temsili olduğundan, onun hakkında ne düşündüğünüzün bir önemi yoktur. Verileri varsa 0x65 0x66 0x67 0x68, bunu tersine çevirirsiniz 0x68 0x67 0x66 0x65. Bu verilere karakter açısından bakıyor olsaydınız, başlangıçta sahip olurdu A B C D, ama şimdi elinizde D C B A.

Bir bayt akışına dönüş - bu sadece bir veri dizisidir. Kullanmak için verilerin neyi temsil ettiğini bilmeniz gerekir. Bir metin dosyası okuyorsak, dosyayı okurken alacağınız byte akışı sadece bir tür karakter olacaktır. Yürütülebilir bir dosya içinde bir sürü yazdırılamaz karaktere sahiptir, bu yüzden ikili dosya olarak adlandırılırdı . Açıkçası, bir metin düzenleyicide bir yürütülebilir dosyayı açmak mümkündür, ancak yararlı bir şey yapmaz.


1
+1 ancak lat bitindeki ikili vurgu vurgusu yanlış görünüyor. "ikili veri" genellikle yazdırılamaz karakterler içeriyor, ancak "ikili" olarak adlandırılıyor, çünkü yazdırılamayan karakterler içerdiğinden ikili basamaklardan oluşuyor. Yazdırılabilir "metin" verilerine zıt olarak "ikili" kullandığınızı anlıyorum, ancak bunun OP'yi daha da karıştırabileceğini düşünüyorum.
Caleb

Tersine çevirme ile ilgili bir sorum var. Bir dosyada bir tamsayı (32 bit) 325487 varsa, bu 4 bayt tamsayıyı nasıl tersine çevirebilirim? Benzer şekilde bir kelimeye de sahibim ("hai nasılsın"), bu dizgiyi her karakteri bir bayt olarak kabul ederek nasıl tersine çevirebilirim.
user2720323 6:13

@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Bu, tam anlamıyla her baytı alır, doğru konuma kaydırır ve diğerleriyle birleştirir.
Neil

2

Bir bayt akışı, sıralı bir bayt dizisidir. Selefi olmayan bir ilk bayt var. Halefi ikinci bayttır, vb. Günümüzde, bir baytın sekiz bitten oluştuğu anlaşılmaktadır. Daha kesin olmak istiyorsak, sekizli akış ve sekizli terimini kullanırız . Hala sekiz bit genişliğinde olmayan baytlı bilgisayarlar var.

Onaltılık sayıları yazmanın bir yoludur ve ikili veriler için basılı bir temsil işlevi görür . Onaltılık aslında metindir. Örneğin, onaltılık değer FEbir baytı temsil edebilir: 11111110ondalık değere sahip bitler 255. Ancak FEaslında bir karakter karakterden oluşan dizedir Fve Egerektirir iki US-ASCII veya ISO-646 karakter kümesindeki bayt! Bu iki bayt ne FE olduğu ve değer 254 ile tek baytlık ne FE temsil basılı bir gösterimi olarak,.

Bir iletişim kanalı veya dosya tanıtıcısı ya da bazı tür cihaz bir bayt akışı taşıyan olarak tarif edilir ve başka hiçbir bilgi verilirse, çok büyük olasılıkla yok değil bu yüzden akışında her soyut bayt gerektirdiğini, bayt onaltılık metin olarak temsil edilir anlamına iki fiziksel bayt.

Ham veriler ise sadece "bit dizisi" dışında herhangi bir yapıya sahip olduğu yorumlanmayan bit anlamına gelir. Ham veri genellikle bir yapıya sahiptir ve bir şeyi temsil eder, ancak ham veri olarak baktığımızda ya şu anki yorumu görmezden geliyoruz (örneğin, doğruluğunu aşağı doğrulamak için bir veri türünün ham temsiline bakıyoruz) bit seviyesi detayına göre) veya yorum mevcut değil (bazı verilerimiz var, ancak verilerin yapısını ve neyi temsil ettiğini anlamıyoruz).


PDP-10 değişken büyüklükteki baytlarla baş etmek için talimatlara sahipti. En yaygın olanı yedi bitlik ASCII ve ardından altı bitlik karakterlerdir.
kevin cl

0

Bir bayt 8 bittir. Bit, 0 veya 1'dir. "Ham veri", birbiri ardına yalnızca bir baytlık bir akıştır. Bir bayt akışı bir dosyadan, bir ağ bağlantısından, serileştirilmiş bir nesneden, rastgele bir sayı üreticisinden, vb. Gelebilir.

  • Bir baytı görüntülemenin birkaç yolu vardır: ikili (01110110), onaltılık = onaltılık (7C), sekizli (0271) veya ondalık (215). Her durumda, maksimum değer 255'tir (temel 10).

  • Bazen bayt, ascii gibi karakterlere atanır. Bir unix komut satırına "ascii" yazın; 0-255 veya (0-FF hex) bayt değerlerini ilişkili karakterle eşleştiren büyük bir tablo elde edersiniz. Örneğin, boşluk x20 ve "A" ise x40'dır. Bazı bayt değerlerinin karakterleri kontrol etmek için eşlendiğini ve yazdırılamadığını unutmayın. Ama baytların kendisi karakter değil - sadece bir bit paketi. Bir sayı.

  • "ters 4 bayt", 123 42 231 0 bazı baytları almak ve sırayı çevirmek olacaktır - 0 231 42 123. Bir bayt buharına uygulanırsa, muhtemelen 4 bayt okudum, onları ters çevirdim, sonraki 4 baytı okudum, .

(BTW bu sorunla ilgilidir, çünkü 255'ten büyük bir sayıyı bayt olarak temsil etmek istiyorsanız, birden fazla bayt kullanmanız gerekir. Fakat o zaman soru şudur: "en büyük" bayt önce mi yoksa son mu? büyük endian veya küçük endian - ham bayt akışında baytların etrafında dolaşmanın neden yararlı olduğu konusunda daha fazla bilgi edinin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.