Рубрики
Без рубрики

Преобразуйте эндин в C ++ и проверьте его с GDB и Python

Введение Как мы знаем, что сетевой байт Заказ, используйте большой Endian и семейный процессор X86 … Теги с CPP, GDB, Python.

Вступление

Как мы знаем Сетевой байт Заказать использовать Большой Endian и x86 Семейные процессоры используют Маленький Endian Отказ Итак, нам нужно преобразовать их.

Реализация

Здесь это одна из реализации. Идея состоит в том, что мы используем двоичное управление для перестройки порядка байта.

auto little_to_big(int32_t num) -> int32_t {
  return (num >> 24 & 0x000000FF) ^ 
         (num >> 8  & 0x0000FF00) ^ 
         (num << 8  & 0x00FF0000) ^ 
         (num << 24 & 0xFF000000);
}

auto m = int32_t(0x12345678);
auto n = little_to_big(m);

Тестирование

В GDB мы можем легко наблюдать за заказ байта. Установите точку перерыва, запустите ее, назначьте формат и распечатайте его.

(gdb) break main
(gdb) run
(gdb) next
(gdb) next
(gdb) p/x m
(gdb) p/x n

Мы можем использовать Python с GDB и сделать тестирование более гибким.

import gdb

if __name__ == '__main__':
  gdb.execute('break main')
  gdb.execute('run')
  gdb.execute('next')
  gdb.execute('next')
  gdb.execute('p/x m')
  gdb.execute('p/x n')

И тогда мы можем сделать немного рефакторинга кода.

import gdb

def config():
  cmd = ['break main',
         'run'];
  list(map(gdb.execute, cmd))

def trace():
  cmd = ['next',
         'next',
         'p/x m',
         'p/x n']
  list(map(gdb.execute, cmd))

if __name__ == '__main__':
  config()
  trace()

В конце концов

Полный код – здесь Отказ

Пожалуйста, следуйте моим Twitter, Github, Instagram и dev.to

  1. https://twitter.com/_gapry
  2. https://github.com/gapry/
  3. https://www.instagram.com/_gapry/
  4. https://dev.to/gapry

Спасибо за чтение, увидимся в следующий раз.

использованная литература

Оригинал: “https://dev.to/gapry/convert-little-endian-to-big-endian-pgg”