Писане код, независимо от реда байт, в гр

байт поръчка

Този термин се отнася до това как магазините и използва байта система: поръчате от най-старите до най-младият (запис започва с най-значимият байт и завършва с най-ниска, голям къс), редът от най-малките до най-старият (запис на данни започва с по-младите и по-възрастните краищата, малко къс).

Съхранение на байта в паметта

Таблица 1. Съхранение байта голям къс (Big-къс)

Имайте предвид предишната таблица - номера са в обратен ред. За запомняне реда на следния полезен правило: ниското байт е написан първият (реда "от най-малките до най-старият" - малко къс), високата байт е написан първия (от порядъка на "голям-къс" - голям къс).

Регистри и байт поръчка

Байт поръчка е важно само, когато е необходимо да се прекъсне последователността на мулти-байт и пишат байтове в последователни места в паметта. Въпреки това, ако има 32-битов регистър, който притежава стойност на 32-битова, тогава няма смисъл да говорим за подаване на поръчката от байтове в паметта. Регистрирайте се, не е чувствителен към реда на "голям-къс" или "от по-младите към по-възрастните"; само да се регистрирате магазина 32-битова стойност. Най-дясната бит е най-маловажният, първия октет е старши.

значение endianness

Редът на байт е атрибут на системата, която определя дали числа са представени от ляво на дясно или от дясно на ляво. В много програмисти мисля днешния свят на виртуални машини и гигахерца процесори защо те следва да разгледа въпроса разгледани в тази статия? За съжаление, това е необходимо да се разгледа по реда байт всеки път, хардуер или софтуер. И като цяло, няма универсално правило за това как да се използва реда байт.

Всички процесори трябва да бъдат проектирани с каквато и да е "от най-малките до най-старият" или "голям къс". Например, семейството на Intel® процесори 80x86 и техните клонинги са използвани "от по-младите към по-възрастните", докато слънцето SPARC процесори, Motorola 68K и PowerPC® използват поръчка "от по-старите към по-младите."

Запис на заповед байт памет е голям проблем при пренасяне по мрежата. За пореден път, че ако изпратите на броя създадени по същия байт реда на записване, на компютър, който използва обратен ред на писане, че има проблем. Ситуацията допълнително се усложнява, ако поръчката не е известен запис на байта на отдалечената машина.

Пример 1 показва следствие от програмиране изключва различията в посока запис байт.

Пример 1. Програмиране изключва различията в посока запис байт
Пример 2. Изходният hexdump -C на компютъра с ред "от по-стара в по-малка"
Пример 3. Заключение hexdump -С команда от порядъка запис "от най-малкото на старата"

Ефект на съхранение от порядъка на байта в паметта за код

Разликата в реда байт не винаги се отразява на резултатите от дейността. Ако извърши побитови операции, или побитовото преминаването към целочислени стойности, тогава не се вземат под внимание на реда на байта в паметта. Компютърна организира няколко байта, така че най-маловажния байт винаги е най-младият, най-значимият байт винаги е старши.

Сега си представете, че тази линия трябва да се запише във файла с помощта на запис () тип метод. Поставяме показалеца м и определя броя на байтовете да пише на файла (в този случай четири). запис () метод дръжки байт по байт и ги записва във файл, започващ с м и завършва нов ред.

Така че, сме доказали, че поръчката байт не влияе на представянето на низове в C.

въпроси Byte ред. когато използвате гласове, който зависи от конкретната байт ред. Пример за такава ситуация е показано в пример 4. но имайте предвид, че има много различни видове намаления, които могат да причинят проблеми.

Пример 4. принуждават къс

Каква ще бъде стойността на х. Нека да погледнем какво прави кода. Ние сме създали две масив от байтове, а след това да го конвертирате в кратък вид. Използването масив, ние всъщност позволява системата да се използва специфичен байт поръчка; нека да видим как системата ще се справят с тези два байта.

Ако се използва подход "от младши на старши", 0 и 1 са тълкува назад и ще бъдат представени като 0,1. Тъй като високо байт 0 и най-маловажния байт 1, на стойност х е равно на 1.

От друга страна, в системата с реда на "голям-къс" маловажният бит е 1, а стойността на х е равен на 256.

Определяне endianness по време на изпълнение

Един от начините да се определи реда на байтове в системата - е да проверите местоположението в памет на предварително определена константа. Спомнете си, че настаняване единици (1) от тип цяло число 32-битов номер ще се четат - 00 00 00 01 за да поръчате "голям-къс" и 01 00 00 00 Поръчка "от най-малкия до най". С поглед към първия байт от това постоянно да укажете реда на байтове в определена платформа, а след това да се вземе най-ефективното действие в тази ситуация.

Пример 5 разглежда първия байт на цяло число и да се определи, че е 0 или 1. Ако е 1, сегашната платформа използва байта в режим на памет "от нисък ред на високо", а ако 0 - тогава режимът е "голям-къс ".

Пример 5. Определяне къс

Друг начин да се определи реда на байта е използването на указатели към героите байта включително тип Int и след това проверете първия байт - това е 0 или 1. Пример 6 илюстрира този метод.

Пример 6. Индекси символи

Мрежа байт

Байт поръчка "от по-старите към по-младите", както се използва в протокола TCP / IP, понякога се нарича байт ред мрежа. Дори ако компютрите в мрежата, като се използва процедурата "от най-малките до най-старите," ценности многобайтови целочислени за пренос през мрежата, за да бъдат превърнати в мрежата байт ред, а след това отново да се превърнат отново в ред "от най-малките до най-старият", при получателя.

Ако топчето работи на процесор, който използва реда байт "от най-малките до най-старият", той трябва да се пренаредят по време на байта на всеки многобайтови стойности на нивата на заглавията на TCP / IP протокол. Ако стека работи в режим на байт "от най-големия до най-малкия", тогава няма причина за безпокойство. Трябваше да стека преносимост (работи на процесора и на двата вида), той трябва да бъде в състояние да вземе решение относно необходимостта от извършване на преподреждане байта по време на компилация.

За да се осъществи това с преустройване контакти предоставят набор от макроси за конвертиране на последователност от байтове в зависимост от тяхното съхранение на хост, и конвертиране на байта, когато прехвърлянето им от хост в мрежата, за байт, както е показано по-долу.

htons () Пренарежда байта на 16-битова стойност без знак на поръчката, използвани в текущата процесор, в мрежата на байт. Макро име може да се дешифрира като "домакин на мрежата кратък" ( ", за да се превърне неподписан кратък номер в мрежата на байт"). htonl () пренарежда байта 32-битова стойност без знак на поръчката, използвани в текущата процесор, в мрежата на байт. Макро име може да се дешифрира като "домакин на мрежата дълго" ( ", за да се превърне неподписан дълго номера в мрежата на байт"). ntohs () Пренарежда байта на 16-битова стойност без знак от мрежата на байт в байт поръчка използва за текущото процесор. макро име може да се декодира като "мрежа, за да бъде домакин на късо" ( "извън строя мрежа, за да може на процесора използва 16-битово число"). ntohl () пренарежда байта 32 байта стойност без знак от мрежа, за байт ред се използва за текущото процесор. макро име може да се декодира като "мрежа, за да бъде домакин на дълга" ( "извън строя мрежа, за да се използва 32-битово число процесор").

Да разгледаме програма на Пример 7.

Пример 7: програма в С

Тази програма показва как съхранява променливите х тип стойност дълго съхраняване 112A380 (шестнадесетичен).

Когато тази програма се изпълнява на един процесор, който използва реда байт "от най-малките до най-старият", това показва информацията, както е описано в пример 8.

Пример 8. В резултат на програма от режима на CPU "От най-малкия до най-"

Пример 9 показва резултатите от една и съща програма за процесор с режим "голям-къс".

Пример 9. Резултатът от програмата на режим CPU "голям-къс"

Обръщането на реда байт

Сега се напише програма, резултатите от които са независими от порядъка байт. Трябва да се гарантира, че данните във файла се записват в правилния ред, когато пишете на файла или четене на данни от нея. Също така трябва да се избягва и условията компилация знамена в кода на програмата, за да предоставят възможност за автоматично определяне на endianness използва в конкретния компютър.

Създаване на набор от функции, които автоматично обръща байт реда на даден параметър, в зависимост от реда байт на компютъра.

Първо трябва да се справят с параметър е тип кратко. разделяща го два байта, а след това "лепило" ги в обратен ред. Както е показано в пример 10 по-долу, функцията връща стойността на тип обратна променлива кратко ако процесорът използва байт за "от младши на старши". В противен случай, функцията ще остави без промяна на стойността на променлива те на.

Пример 10 Метод 1: Използване на изместване малко и залепване бита

Функцията се превръща peremennayayu тип кратко по-долу. да го представи като масив от символи и след това се създава нов масив, който е обратен на първия, ако процесорът използва режим "от най-малките до най-старият."

Пример 11. Метод 2: Използване на указатели към характер масив

Сега е ред на вътр.

Пример 12 Метод 1: Използване малко изместване и байт тип свързване Int

Тази по-голяма или по-малко съответства на това, което сме свикнали да правим за промяна в обратен ред, за да напишете кратко. но за четири байта, а не два.

Пример 13. Метод 2: Използване на характер масив от указатели към тип Int

Същото нещо, което направихме за обръщането на променлива от тип кратък. но четири байта преработени тук.

По същия начин, можете да промените на голям къс, за да поплавък, дълги, двойни и други видове, но разглеждането на тези въпроси е извън обхвата на тази статия.

заключение

Като цяло, не е особено предимство в използването на определен байт ред. И двете поръчки са общи и се използват в много компютърна архитектура. Процесори режим работещи "от по-младите към по-възрастните", използван при повечето персонални компютри.

Проблеми с реда байт не влияе променливи, които се съхраняват в един байт, като "байтове" се счита за основна единица за съхранение на информация в паметта. От друга страна многобайтови величини зависят от порядъка байт. трябва да се има предвид, когато създавате приложението.

Вземете продукти и технологии

  • IBM пробен софтуер. пробни версии на софтуерните разработчици, които могат да бъдат изтеглени от developerWorks. (EN)