Byte -> Int konvertierung
Übersicht

![]() |
SchnittlauchUnkrautBetreff: Byte -> Int konvertierung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der PC speichert die Zahlen im Zweierkomplement-Verfahren.... -> http://de.wikipedia.org/wiki/Zweierkomplement | ||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit Vorzeichen ist es genau das Gleiche. | ||
http://bl4ckd0g.funpic.de |
![]() |
SchnittlauchUnkraut |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay thx | ||
Ich wars nicht. |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. Urbachehemals "Basicprogger" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@BtbN: Ihh, dann doch lieber ohne Cast! ![]() 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! ![]() |
||
http://bl4ckd0g.funpic.de |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! ![]() |
||
http://bl4ckd0g.funpic.de |
![]() |
SchnittlauchUnkraut |
![]() Antworten mit Zitat ![]() |
---|---|---|
@TheShadow
Deine Methode funktioniert auch nicht mir negativen Zahlen. |
||
Ich wars nicht. |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Doch, tut sie! | ||
http://bl4ckd0g.funpic.de |
![]() |
SchnittlauchUnkraut |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, dann entschuldigung D:
Dann habe ich wohl einen fehler gemacht. |
||
Ich wars nicht. |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group