The most usual storage is in RGBA (usually the default in many places) and sometimes you see BGRA (used in TGA image formats, and some Mac or Adobe formats). As for big-endian versus little-endian, it doesn't really matter when you are getting the data from a file. In a file format, the endianness is fixed by the file format standard, but of course, you have to read it correctly based on the endianness of the running platform. And usually, when you read the data off the file, you'll end up with either RGBA or BGRA, or some other format that you'll have to convert or deal with differently (e.g. palettes). I don't think that OpenGL supports ARGB, so you probably would have to manually convert that to RGBA if you have some weird image format that actually requires ARGB. You can also try the unofficial extension called GL_ARGB_EXT which you can place in the format argument of glTexImage2D functions, if your platform supports it, some do.
Also, you should use a fixed-length integer type for that argb field in the union. The type unsigned int is not guaranteed to be 32bit, and often won't be on most 64bit architectures. You should use the stdint.h header file (from C standard) and the unsigned integer type uint32_t.
As for the texture size (width height), you cannot do like you did with w * dx and h * dy. Think about it, how are textures stored in memory? Usually, they'll be stored as one complete row of pixels after the other. If your rows are of length w, but you tell OpenGL that the rows are of length w * dx, what you will end up with is that OpenGL will read the first row entirely plus (dx - 1) of the next row and store that as the first row of the texture, and then all the other rows of pixels will be shifted as well, until you reach the end of the image memory and then OpenGL will start reading memory beyond your image storage (which could possibly cause a crash by an Access Violation or Segmentation Fault).
The correct way to do this is to first load a power-of-two texture and then use glTexSubImage2D to load your non-power-of-two texture. Or you can rely on the assumption that you will not run your program on any old hardware that doesn't support non-power-of-two (NPOT) textures (pre-OpenGL 2.0). That latter solution is simple, just give the w and h as width and height to the glTexImage2D function and if the hardware is not ancient, it won't matter if these values are not powers of two. The former solution (pre-loading a power-of-two texture, and then using glTexSubImage2D) can be done as follows:
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, sprite.w * sprite.dx, sprite.h * sprite.dy, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, sprite.w, sprite.h, (isBigEndian() ? GL_ARGB_EXT : GL_BGRA), GL_UNSIGNED_BYTE, sprite.data);
And that's it (assuming you fix the RGBA / ARGB business).