Mailing Lists: Apple Mailing Lists
Image of Mac OS face in stamp
Re: Windows-Mac character problems with openplay...
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Windows-Mac character problems with openplay...



I'm definitely able to send ints and on other structures using OpenPlay on Windows to and from OpenPlay on the Mac.

I suspect that the problem you are encountering is endianness of the two platforms. The x86 architecture is little endian, the PowerPC and most other processors are big endian (or can run either way). That means that on Windows, if you look at how a long is stored in memory, it is the reverse of how you see it written normally. Consider this example:

for the hex value 0x01520080

memory
address 0 1 2 3
data 80 00 52 01 (little endian) - big endian machine would read as 0x80005201
data 01 52 00 80 (big endian) - little endian machine would read as 0x80005201


By convention, Network Byte Order is big endian. So if you are going to send back and forth between different platforms, you should make sure your data is in network byte order before sending. Keep in mind that anything that is a single byte wide doesn't suffer from this, nor do char strings (wide char strings do have byte order issues). So by sending things as a string, you are dodging the problem. Likewise, if you find that the values you are sending will fit into a byte (signed or unsigned char) then you are also fine.

The odd part about your problem is "it just doesn't seem to send anything at all". I would expect you to get the data but to get it reversed. Are you sure you are not receiving any data? If you are sending a structure and it's size, then the size might be suffering the same problem, making it seem as if some data isn't coming across.

This is also an issue for disk files, so if you want to share saved games/map files/game data files between platforms you will want to apply the same techniques.

Here are some convenient macros you can use to swap byte order. you have to #define PLATFORM_LITTLE_ENDIAN 1 on Windows and any other little endian targets.

#define Endian16_Swizzle(n)                         \
            (((((unsigned short)n)<<8) & 0xff00)  | \
             ((((unsigned short)n)>>8) & 0x00ff))

#define Endian32_Swizzle(n)                             \
            (((((unsigned long)n)<<24) & 0xff000000)  | \
             ((((unsigned long)n)<<8)  & 0x00ff0000)  | \
             ((((unsigned long)n)>>8)  & 0x0000ff00)  | \
             ((((unsigned long)n)>>24) & 0x000000ff))

#if PLATFORM_LITTLE_ENDIAN
    #define BigEndian16_ToNative(n) Endian16_Swizzle(n)
    #define BigEndian32_ToNative(n) Endian32_Swizzle(n)
    #define Native_ToBigEndian16(n) Endian16_Swizzle(n)
    #define Native_ToBigEndian32(n) Endian32_Swizzle(n)
    #define LittleEndian16_ToNative(n) n
    #define LittleEndian32_toNative(n) n
    #define Native_ToLittleEndian16(n) n
    #define Native_ToLittleEndian32(n) n
#else
    #define BigEndian16_ToNative(n) n
    #define BigEndian32_ToNative(n) n
    #define Native_ToBigEndian16(n) n
    #define Native_ToBigEndian32(n) n
    #define LittleEndian16_ToNative(n) Endian16_Swizzle(n)
    #define LittleEndian32_toNative(n) Endian32_Swizzle(n)
    #define Native_ToLittleEndian16(n) Endian16_Swizzle(n)
    #define Native_ToLittleEndian32(n) Endian32_Swizzle(n)
#endif

To use these, just copy the data into them in network byte order before you send -- be careful to swap back the data if you then pass the data on to other parts of your code before sending. For example:

// send the player login info to the client to tell the client which player they are and how many are playing
SocPacket packet;
packet.loginInfo.playerNum = playerNum;
packet.loginInfo.playerCount = mGame.getNumPlayers();
packet.loginInfo.turnTimeLimit = Native_ToBigEndian16(mGame.getTurnTimeLimit());
sendPacket(player->getID(), packet, packet_Login);


Hope this helps,
Ed

On Dec 7, 2004, at 6:47 AM, Trevor Agnitti wrote:

An odd issue maybe someone else has seen...
I have been having some odd problems sending integers (and a few other types) from mac to windows and (vice versa). I can send chars and strings of chars, but when I send an integer to a windows build of my program, it just doesn't seem to send anything at all. I can send integers from mac to mac builds, but they just don't appear to send to windows versions. I have found ways around this, like by casting small ints as chars, sending them, and then casting them back to ints upon arrival. I have even converted larger ints to strings of text, sending them, and then convert a text "123456" to an integer 123456. The whole thing seems kinda screwy.


I thought perhaps it might be because windows and macs have different ways of storing integers on some level that gets confused in openplay transit.

Did anyone else ever notice this/know a way to fix it?
Is there a bug in some netsprocket code or something?

-Trevor
http://www.lackeyccg.com

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Openplay-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


Ed Zavada
Pixel Dust Games
email@hidden
http://www.pixeldustgames.com/

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Openplay-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


References: 
 >Windows-Mac character problems with openplay... (From: Trevor Agnitti <email@hidden>)



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2011 Apple Inc. All rights reserved.