Wat is een bytestream eigenlijk?

Kan iemand mij uitleggen welke bytestream eigenlijk bevat? Bevat het bytes (hexadecimale gegevens) of binaire gegevens of alleen Engelse letters? Ik ben ook in de war over de term “ruwe gegevens”. Als iemand me vroeg om “de gegevens van 4 bytes om te keren”, wat moet ik dan aannemen dat de gegevens hexadecimale code of binaire code zijn?

Opmerkingen

  • Mijn twee cent is geen antwoord waardig (en er zijn al goede hieronder), maar ik wil alleen links naar deze twee artikelen geven die waarschijnlijk een goed inzicht zullen geven over hoe ” onbewerkte gegevens ” wordt geïnterpreteerd om daadwerkelijk iets te betekenen (het betekent niets ‘ tenzij je weet wat het moet vertegenwoordigen en hoe het is gecodeerd / opgeslagen) betterexplained.com/articles/… joelonsoftware. com / artikelen / Unicode.html
  • Ik denk dat java byte heeft gemaakt om het gebruik van c / c ++ ‘ s-teken te vermijden voor dingen die ‘ mag niet als teken worden opgevat. char werd veel gebruikt in c / c ++ omdat de grootte van char 1 byte is. Ook apparaten in Unix zijn blok- en tekenapparaten. Als je leest van teken-apparaten, krijg je een stroom niet-ondertekende tekens / bytes.
  • Bytestream is dubbelzinnig. Octet-stream is dat niet.
  • Gegevens kunnen op veel niveaus worden geïnterpreteerd. Onderaan is het ‘ slechts een reeks aan-uit elektrische niveaus. Een beetje hoger ‘ is een brok bytes, of zoals je zegt, een bytestream . Nog hoger begin je de ruwe data te interpreteren. Bytes kunnen op veel manieren als tekst worden geïnterpreteerd (coderingen). Ook gehele getallen (groot of klein endian). Je kunt zelfs hogerop gaan. Je hebt een zip-bestand. Dat zip-bestand is je back-up van gisteren. Enzovoort. Het probleem is dat het exacte niveau vaak impliciet is en niet duidelijk wordt gemaakt, en dit kan verwarrend zijn.

Antwoord

Byte-streams bevatten, nou ja, bytes. Opgesplitst in wat het werkelijk is, zijn het 8 bits samengesteld uit 1s en 0s. Als het een getal zou vertegenwoordigen, zou het elk getal van 0 tot 255 zijn (wat, ik mag toevoegen, is geen toeval waarom de 4 getallen in een IP-adres altijd variëren van 0 tot 255). Byte streams zijn meestal geavanceerde interfaces die bedoeld zijn om de onderliggende standaard byte-array te verbergen die wordt gebruikt om een circulaire buffer vast te houden (je vult de buffer en wacht tot iemand hem leegmaakt, waarna hij gewoon de buffer vult. nog een keer).

Waar staat dat in vredesnaam voor? Het kan een tekstbestand zijn, of een afbeelding, of een live videostream. Wat het is is volledig afhankelijk van de context van wie het leest. Hex-weergave is een andere manier om hetzelfde te zeggen, hoewel het soms handiger is om bytes te beheren in termen van hun hexadecimale weergave in plaats van getallen, maar het is hetzelfde.

Wanneer u “verwijst naar onbewerkte gegevens, verwijst u meestal naar bytegegevens. De gegevens worden geleverd zonder een tag die zegt:” Ik ben een afbeeldingsbestand! “. Gewoonlijk behandelt u alleen onbewerkte gegevens als u dat niet doet” Het maakt niet uit wat de gegevens in het algemeen vertegenwoordigen. Als ik bijvoorbeeld een afbeelding naar de zwart-witversie wil converteren, zou ik kunnen zeggen dat ik de onbewerkte gegevens van een afbeelding moet lezen en voor elke 3 gelezen bytes (wat in feite een weergave van een rode kleur, een weergave van een groene kleur en weergave van blauwe kleur), tel de getalswaarde op en deel deze door 3, en schrijf die waarde driemaal. Wat ik eigenlijk zou doen, is het middelen van de rode, groene en blauwe waarden van een pixel en daaruit zijn grijze equivalente pixel maken Als je het echter hebt over het uitvoeren van bewerkingen op gegevens op het niveau van “byte voor byte”, geeft het je niet echt om het grote geheel, om zo te zeggen.

Of misschien wil je een bestand in een database opslaan, maar het vraagt je om zijn “ruwe data” in een blob data type in te voegen. Dit betekent simpelweg dat de gegevens van een bestand moeten worden geconverteerd naar een array met grote bytes die de database kan begrijpen en beheren. U zult zien dat wanneer u die waarde uit de database ophaalt, het eenvoudigweg één grote byte-array is, zoals u aanvankelijk aan de database hebt verstrekt. Als die gegevens een bestand waren, moet u, de programmeur, die byte opnieuw interpreteren data alsof je een bestand byte per keer leest.

Als iemand je zou vragen om “de 4 byte data om te keren”, zou ik aannemen dat het verwijst naar big-endian versus little-endian interpretatie van getallen , dat getallen schrijft die beginnen met de meest of minst significante byte. Het maakt niet uit of een getal wordt weergegeven als big-endian of little-endian, alleen dat alle systemen die het getal lezen, het consistent interpreteren.

Dit Het is niet te zeggen dat de feitelijke nummerweergave (of hexadecimale weergave) is veranderd, simpelweg dat de volgorde waarin deze 4 bytes een nummer vormen, moet worden omgekeerd. Dus stel dat je 0x01, 0x02, 0x03 en 0x04 hebt.Om deze om te keren, “zou je in plaats daarvan 0x04, 0x03, 0x02, 0x01 hebben. Het systeem zou deze 4 bytes waarschijnlijk in omgekeerde volgorde lezen en aangezien je hem al hebt omgekeerd, wordt de waarde geïnterpreteerd als precies hetzelfde als wat was bedoeld in de ruwe gegevens.

Ik hoop dat dit het verklaart!

Reacties

  • Alles is in orde ..! Kunt u het antwoord alstublieft nader toelichten met ” onbewerkte gegevens “?
  • @ user2720323 Oké, aangepast om beter uit te leggen ” onbewerkte gegevens. ” 🙂
  • Eén ding om in gedachten te houden … alle gegevens zijn gewoon een verzameling van bytes. De betekenis van die bytes wordt bepaald door een soort metagegevens (bestandsextensie, databaseveld, enz.). Een afbeeldingsbestand kan worden geïnterpreteerd als een ASCII-bestand en vice versa. De tekst of afbeelding is misschien zinloos, maar het is nog steeds mogelijk. (Derp … ik had de volgende antwoorden moeten lezen)
  • @kevincline Probeer alsjeblieft te waarderen dat ik ‘ een idee probeer over te brengen. Mijn prioriteit is niet ‘ t om een nauwkeurig algoritme te schrijven. Als je nauwkeuriger wilde zijn, weeg je ‘ de waarden voor rood, groen en blauw op basis van wat het menselijk oog kan waarnemen.

Answer

Een byte is gewoon een informatie-eenheid – het kan van alles zijn. Een byte op zichzelf betekent niets, je moet er een betekenis aan hechten.

Dus, om dat uit te breiden –

Bevat het bytes (hex-data) of binaire data of alleen Engelse letters?

Hex-data is hetzelfde als binaire data. Het ” Het is gewoon een andere manier om de gegevens weer te geven. Bijvoorbeeld 0x41 = 0b01000001 = “A” = 65 (decimaal). Engelse letters zouden daar slechts een subset van zijn.

Als iemand me zou vragen “de 4 byte-gegevens om te keren”, wat moet ik dan aannemen dat de gegevens hex-code of binaire code?

Aangezien hex slechts een representatie is van de gegevens, maakt het niet uit hoe u denkt erover. Als u gegevens heeft van 0x65 0x66 0x67 0x68, zou u om deze om te keren 0x68 0x67 0x66 0x65 krijgen. Als u naar deze gegevens zou kijken in termen van tekens, zou je oorspronkelijk A B C D hebben, maar nu heb je D C B A.

Terug naar een bytestream – het is gewoon een reeks gegevens. U moet weten wat de gegevens vertegenwoordigen om ze te kunnen gebruiken. Als we een tekstbestand aan het lezen zijn, zou de bytestream die je zou krijgen als je het bestand aan het lezen was, slechts tekens van een soort zijn. Een uitvoerbaar bestand zou een aantal niet-afdrukbare tekens bevatten, daarom zou het een binair bestand worden genoemd. Het is duidelijk dat het mogelijk is om een uitvoerbaar bestand te openen in een teksteditor, maar het doet niets nuttigs.

Opmerkingen

  • +1 maar de nadruk op binair in de lat bit lijkt misplaatst. ” binaire gegevens ” bevatten vaak niet-afdrukbare tekens, maar ‘ wordt ” binair ” omdat het ‘ is samengesteld uit binaire cijfers, niet omdat het niet-afdrukbare tekens bevat . Ik begrijp dat u ‘ ” binair ” gebruikt in tegenstelling tot afdrukbare ” text ” data, maar ik denk dat dit het OP nog meer in verwarring kan brengen.
  • Ik heb een vraag over omkering. Als ik een geheel getal (32 bit) 325487 in een bestand heb, hoe kan ik dit 4 byte geheel getal dan omkeren? op dezelfde manier heb ik een woord (” hai hoe gaat het “), hoe je deze string kunt omkeren door elk teken als een byte aan te nemen.
  • @ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Dit neemt letterlijk elke byte, verschuift deze naar de juiste positie en combineert met de andere.

Answer

Een bytestream is een geordende reeks bytes. Er is een eerste byte, die geen voorganger heeft. Zijn opvolger is de tweede byte, enzovoort. Tegenwoordig wordt algemeen aangenomen dat een byte uit acht bits bestaat. Als we nauwkeuriger willen zijn, gebruiken we de term octet stream en octet . Er bestaan nog steeds computers met bytes die niet “acht bits breed zijn.

Hexadecimaal is een manier om getallen te schrijven en dient als een afgedrukte weergave voor binaire gegevens. Hexadecimaal is eigenlijk tekst . De hexadecimale waarde FE kan bijvoorbeeld een byte vertegenwoordigen: de bits 11111110 die de decimale waarde .FE is echter eigenlijk een tekenreeks die bestaat uit de tekens F en E, waarvoor twee bytes in de tekenset US-ASCII of ISO-646! Deze twee bytes is wat FE is , en de enkele byte met waarde 254 is wat de FE vertegenwoordigt , als een afgedrukte notatie.

Als een communicatiekanaal, of bestandshandvat of een dergelijk apparaat wordt beschreven aangezien het een bytestream draagt en er geen andere informatie wordt gegeven, betekent dit vrijwel zeker niet dat bytes worden weergegeven als hexadecimale tekst , zodat elke abstracte byte in de stroom twee fysieke bytes vereist.

En onbewerkte gegevens zijn eenvoudig bits die niet worden geïnterpreteerd om een structuur te hebben die verder gaat dan alleen een “reeks bits”. Ruwe gegevens hebben meestal een structuur en vertegenwoordigen iets, maar als we het als onbewerkte gegevens bekijken, negeren we de interpretatie momenteel (we kijken bijvoorbeeld naar de onbewerkte weergave van een gegevenstype om de juistheid ervan te verifiëren op bitniveau detail), of de interpretatie is niet beschikbaar (we hebben enkele gegevens, maar we begrijpen de structuur van de gegevens niet en wat ze vertegenwoordigen).

Opmerkingen

  • De PDP-10 had instructies om met bytes van variabele grootte om te gaan. De meest voorkomende was zeven bits ASCII, gevolgd door zes bits tekens.

Antwoord

Een byte is 8 stukjes. Een bit is 0 of 1. De “ruwe data” is slechts een stroom van de ene byte na de andere. Een bytestream kan afkomstig zijn van een bestand, een netwerkverbinding, een geserialiseerd object, een generator voor willekeurige getallen, enz.

  • Er zijn verschillende manieren om een byte weer te geven: binair (01110110) , hex = hexidecimaal (7C), octaal (0271) of decimaal (215). In alle gevallen is de maximumwaarde 255 (grondtal 10).

  • Soms worden bytes toegewezen aan tekens, zoals ascii. Typ “ascii” op een unix-opdrachtregel en u “krijgt een grote tabel die de byte-waarden 0-255 of (0-FF hex) toewijst aan het bijbehorende teken. De spatie is bijvoorbeeld x20 en” A “is x40 Merk op dat sommige bytewaarden worden toegewezen aan controletekens en niet kunnen worden afgedrukt. Maar de bytes zelf zijn geen tekens – ze zijn slechts een bundel bits. Een getal.

  • “4 bytes omkeren” zou zijn om enkele bytes 123 42 231 0 te nemen en de volgorde om te draaien – 0 231 42 123. Toegepast op een byte stoom, I “d waarschijnlijk 4 bytes gelezen, ze omkeren, de volgende 4 bytes lezen, enz.

(Dat probleem is trouwens relevant, want als je een getal groter dan 255 als byes, je moet meer dan één byte gebruiken. Maar dan is de vraag: komt de grootste byte eerst of de laatste? Dat wordt big endian of little endian genoemd – zoek die op voor meer achtergrondinformatie over waarom het is handig om de bytes in een onbewerkte bytestream door elkaar te halen.)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *