/* OpenIDA - Outil d'analyse de fichiers binaires * endianness.c - manipulation abstraite des nombres * * Copyright (C) 2008 Cyrille Bagard * * This file is part of OpenIDA. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "endianness.h" /****************************************************************************** * * * Paramètres : target = lieu d'enregistrement de la lecture. [OUT] * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * endian = ordre des bits dans la source. * * * * Description : Lit un nombre non signé sur un octet. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool read_u8(uint8_t *target, const bin_t *data, off_t *pos, off_t len, SourceEndian endian) { if ((len - *pos) < 1) return false; *target = data[*pos]; *pos += 1; return true; } /****************************************************************************** * * * Paramètres : target = lieu d'enregistrement de la lecture. [OUT] * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * endian = ordre des bits dans la source. * * * * Description : Lit un nombre non signé sur deux octets. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool read_u16(uint16_t *target, const bin_t *data, off_t *pos, off_t len, SourceEndian endian) { if ((len - *pos) < 2) return false; switch (endian) { case SRE_LITTLE: #if __BYTE_ORDER == __LITTLE_ENDIAN *target = data[*pos] | (uint16_t)data[*pos + 1] << 8; #elif __BYTE_ORDER == __BIG_ENDIAN *target = data[*pos + 1] | (uint16_t)data[*pos] << 8; #else # error "TODO : PDP !" #endif break; case SRE_BIG: #if __BYTE_ORDER == __LITTLE_ENDIAN *target = data[*pos + 1] | (uint16_t)data[*pos] << 8; #elif __BYTE_ORDER == __BIG_ENDIAN *target = data[*pos] | (uint16_t)data[*pos + 1] << 8; #else # error "TODO : PDP !" #endif break; } *pos += 2; return true; } /****************************************************************************** * * * Paramètres : target = lieu d'enregistrement de la lecture. [OUT] * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * endian = ordre des bits dans la source. * * * * Description : Lit un nombre non signé sur quatre octets. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool read_u32(uint32_t *target, const bin_t *data, off_t *pos, off_t len, SourceEndian endian) { if ((len - *pos) < 4) return false; switch (endian) { case SRE_LITTLE: #if __BYTE_ORDER == __LITTLE_ENDIAN *target = data[*pos] | (uint32_t)data[*pos + 1] << 8; *target |= data[*pos + 2] << 16 | (uint32_t)data[*pos + 3] << 24; #elif __BYTE_ORDER == __BIG_ENDIAN *target = data[*pos + 3] | (uint32_t)data[*pos + 2] << 8; *target |= data[*pos + 1] << 16 | (uint32_t)data[*pos] << 24; #else # error "TODO : PDP !" #endif break; case SRE_BIG: #if __BYTE_ORDER == __LITTLE_ENDIAN *target = data[*pos + 3] | (uint32_t)data[*pos + 2] << 8; *target |= data[*pos + 1] << 16 | (uint32_t)data[*pos] << 24; #elif __BYTE_ORDER == __BIG_ENDIAN *target = data[*pos] | (uint32_t)data[*pos + 1] << 8; *target |= data[*pos + 2] << 16 | (uint32_t)data[*pos + 3] << 24; #else # error "TODO : PDP !" #endif break; } *pos += 4; return true; } /****************************************************************************** * * * Paramètres : target = lieu d'enregistrement de la lecture. [OUT] * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * endian = ordre des bits dans la source. * * * * Description : Lit un nombre non signé sur huit octets. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool read_u64(uint64_t *target, const bin_t *data, off_t *pos, off_t len, SourceEndian endian) { return false; }