Thanks for the help, guys.
DamonHD, I actually was using your page as my reference

I've now formatted it as vfat, which doestn't give any error. To check if things were ok, I copied the same file to it 4 times, and used md5sum to check if it was OK. The first copy had the correct checksum, but the other 3 got corrupted:
$ md5sum *
c660c7998006aa113dc66978c489b346 SACRED_PLANET_1.ISO
5619a1ca23934c4bf5a4e24cc4709919 SACRED_PLANET_2.ISO
ad38abb71e390e0e0e83b59ac66738b6 SACRED_PLANET_3.ISO
0cacdfeecd582f3779ae525ac118a007 SACRED_PLANET_4.ISO
I have now tried formatting my pendrive as ext3. Used exactly the same commands I was using for memory cards, except that, with it, everything works!
No fsck errors, no corrupter files, all good. =)
After that, I've tried with a MemoryStick Duo and had exactly the same errors described with the SD cards. =(
This is output of mkfs:
$ sudo mkfs.ext2 /dev/sdb1
mke2fs 1.41.9 (22-Aug-2009)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1009856 inodes, 4032889 blocks
201644 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4131389440
124 block groups
32768 blocks per group, 32768 fragments per group
8144 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
$ sudo fsck /dev/sdb1 -f -C
fsck from util-linux-ng 2.16
e2fsck 1.41.9 (22-Aug-2009)
Pass 1: Checking inodes, blocks, and sizes
Inode 661073 has EXTENTS_FL flag set on filesystem without extents support.
Erase<y>? yes
Inode 661074 has EXTENTS_FL flag set on filesystem without extents support.
Erase<y>? yes
Inode 661075 has EXTENTS_FL flag set on filesystem without extents support.
Erase<y>? yes
Inode 661076 has EXTENTS_FL flag set on filesystem without extents support.
Erase<y>? yes
Inode 661077 is in use, but has dtime set. Fix<y>? yes
Inode 661077 has a extra size (22912) which is invalid
Fix<y>? yes
Inode 661078 has EXTENTS_FL flag set on filesystem without extents support.
Erase<y>? yes
Inode 661079 is in use, but has dtime set. Fix<y>? yes
Inode 661079 has a extra size (35855) which is invalid
Fix<y>? yes
Inode 661080 is in use, but has dtime set. Fix<y>? yes
Inode 661080 has a extra size (64965) which is invalid
Fix<y>? yes
Inode 661081 is in use, but has dtime set. Fix<y>? yes
Inode 661081 has imagic flag set. Erase<y>?
..........Continues forever, zillions of errors.......
Actually, I'm starting to get suspicious about all those memory cards. Maybe I should stop buying brandless stuff.