Byte -> Int konvertierung

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Schnittlauch

Unkraut

Betreff: Byte -> Int konvertierung

BeitragMi, Aug 01, 2007 10:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich würde gerne wissen wie ich aus 4 Bytes ein Int mit Vorzeichen machen kann.
Ohne vorzeichen ist ja sympel:
int = (byte1*$100000 + bytes2*$10000 + byte3*$100 + byte4)/100000

Aber wie siets mit Vorzeichen aus?

MFG
Schnittlauch

PS: Smalltalk weil es nicht wirklich was mit BB zu tun hat.
Ich wars nicht.

simi

BeitragMi, Aug 01, 2007 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Der PC speichert die Zahlen im Zweierkomplement-Verfahren.... -> http://de.wikipedia.org/wiki/Zweierkomplement
 

David

BeitragMi, Aug 01, 2007 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Vorzeichen ist es genau das Gleiche.
http://bl4ckd0g.funpic.de

Schnittlauch

Unkraut

BeitragMi, Aug 01, 2007 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay thx
Ich wars nicht.
 

David

BeitragMi, Aug 01, 2007 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei signed Integralen Werten ist nur das MSB als Signedbit reserviert. Die Bitrepräsentation ist aber genau die Gleiche wie bei unsigned Integralen, nur das du eben ein Bit weniger für den Zahlenbereich hast.
http://bl4ckd0g.funpic.de

TheShadow

Moderator

BeitragMi, Aug 01, 2007 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
argb = (a SHL 24) OR (r SHL 16) OR (g SHL 8) OR b

die andere Variante steht zwar in Onlinehilfe - die ist aber nicht 100% "korrekt"... die obere ist vozuziehen
in BlitzMax benutze | statt OR
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

David

BeitragDo, Aug 02, 2007 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, korrekt wäre:

Code: [AUSKLAPPEN]

i = ( b1 * $1000000 ) + ( b2 * $10000 ) + ( b3 * $100 ) + b4


Aber das Equivalent von TheShadow ist trotzdem besser.
http://bl4ckd0g.funpic.de

BtbN

BeitragDo, Aug 02, 2007 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Da es hier nicht speziell um Basic geht:

Code: [AUSKLAPPEN]
union IntBytes
{
   signed int integer;
   struct
   {
      unsigned char byte1;
      unsigned char byte2;
      unsigned char byte3;
      unsigned char byte4;
   } bytes;
};


So könnte man es in C++(ka ob auch in C) realisieren. Der struct und das int teilen sich den selben speicher.
 

E. Urbach

ehemals "Basicprogger"

BeitragDo, Aug 02, 2007 10:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@BtbN:
In welcher Reihenfolge die Bytes gespeichert werden, ist in C++ plattformspezifisch, d.h. du kannst nicht davon ausgehen, dass deine Variable "byte2" auch wirklich das zweite Byte anspricht.
TheShadow's Methode funktioniert hingegen auf allen Plattformen.
 

David

BeitragDo, Aug 02, 2007 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@BtbN: Ihh, dann doch lieber ohne Cast! Neutral Zumal nichtmal garantiert ist das ein unsigned int 32 Bit breit ist... Letzteres Problem lässt sich lösen:

Code: [AUSKLAPPEN]

namespace priv
{
    struct empty_type {};

    template< typename T, typename U, bool flag >
    struct choose
    {
        typedef T value_type;
    };

    template< typename T, typename U >
    struct choose< T, U, false >
    {
        typedef U value_type;
    };

    template< typename T, typename U >
    struct type_list
    {
        typedef T head;
        typedef U tail;
    };
   
    template
    <
        typename T1 = empty_type, typename T2 = empty_type, typename T3 = empty_type,
        typename T4 = empty_type, typename T5 = empty_type, typename T6 = empty_type,
        typename T7 = empty_type, typename T8 = empty_type, typename T9 = empty_type
    >
    struct sequence
    {
    private:
        typedef typename sequence< T2, T3, T4, T5, T6, T7, T8, T9 >::type tail_result;

    public:
        typedef type_list< T1, tail_result > type;
    };

    template<>
    struct sequence<>
    {
        typedef empty_type type;
    };

#ifdef __linux__
    typedef sequence< unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long >::type unsigned_integrals;
#elif _WIN32
    typedef sequence< unsigned char, unsigned short, unsigned int, unsigned long, __uint64 >::type unsigned_integrals;
#else
    #error "Unsupported platform"
#endif

    template< typename list, std::size_t bit > struct type_;
   
    template< typename head, typename tail, std::size_t bit >
    struct type_< type_list< head, tail >, bit >
    {
        typedef typename choose< head,
            typename type_< tail, bit >::value_type, ( sizeof( head ) * CHAR_BIT == bit ) >::value_type value_type;
    };

    template< std::size_t bit >
    struct type_< empty_type, bit >
    {
        typedef void value_type;
    };
}

template< std::size_t bit >
struct uint_
{
    typedef typename priv::type_< priv::unsigned_integrals, bit >::value_type type;
};

typedef uint_< 8 >::type uint8;
typedef uint_< 16 >::type uint16;
typedef uint_< 32 >::type uint32;
typedef uint_< 64 >::type uint64;


Dann könnte man sowas basteln:

Code: [AUSKLAPPEN]

template< bool little_endian >
union int32_byte8_fuck
{
    uint32 i;

    struct
    {
        uint8 b1;
        uint8 b2;
        uint8 b3;
        uint8 b4;
    } bytes;
};

template<>
union int32_byte8_fuck< true >
{
    uint32 i;

    struct
    {
        uint8 b4;
        uint8 b3;
        uint8 b2;
        uint8 b1;
    } bytes;
};


Aber, jetzt weiß ich immer noch nicht wie du damit die 4 Byte in ein int umwandeln willst! Razz
http://bl4ckd0g.funpic.de

BtbN

BeitragFr, Aug 03, 2007 8:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Findest du das nicht ein wenig übertrieben?
Naja, und aus den 4 Bytes macht man ein int, indem man die 4 Bytes in dem Struct auf seine wunsch-bytes setzt, und dann das int ausliest.
 

David

BeitragFr, Aug 03, 2007 8:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist übertrieben aber dafür übergreifend einsetzbar! Und das was du vor hast ist nicht standardkonform und sollte deshalb nicht gemacht werden. Wären wir also wieder bei der shift & or Lösung! Smile
http://bl4ckd0g.funpic.de

Schnittlauch

Unkraut

BeitragFr, Aug 03, 2007 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow

Deine Methode funktioniert auch nicht mir negativen Zahlen.
Ich wars nicht.
 

David

BeitragFr, Aug 03, 2007 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, tut sie!
http://bl4ckd0g.funpic.de

Schnittlauch

Unkraut

BeitragFr, Aug 03, 2007 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, dann entschuldigung D:
Dann habe ich wohl einen fehler gemacht.
Ich wars nicht.
 

David

BeitragFr, Aug 03, 2007 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nich genau was du bezwecken willst. Aber die Bitrepräsentation von signed und unsigned integralen Typen ist exakt die gleiche. Evtl nimmst du einfach den falschen Typ, oder Blitz geht automatisch erstmal von Vorzeichenlosigkeit aus.
http://bl4ckd0g.funpic.de

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group