Make Gigabeat's scramble endian-safe.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12892 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Barry Wardell 2007-03-22 15:53:37 +00:00
parent e5b77b1a47
commit 149a7bab5b
3 changed files with 31 additions and 2 deletions

View File

@ -26,6 +26,21 @@
int iaudio_decode(char *iname, char *oname);
unsigned int le2int(unsigned char* buf)
{
int32_t res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
return res;
}
void int2le(unsigned int val, unsigned char* addr)
{
addr[0] = val & 0xFF;
addr[1] = (val >> 8) & 0xff;
addr[2] = (val >> 16) & 0xff;
addr[3] = (val >> 24) & 0xff;
}
void usage(void)
{
printf("usage: descramble [options] <input file> <output file>\n");

View File

@ -49,6 +49,7 @@ int gigabeat_code(char *infile, char *outfile)
FILE *in, *out;
unsigned long size = 0;
unsigned long bytes_read;
unsigned char buf[4];
unsigned long data;
unsigned long key = 0x19751217;
@ -56,8 +57,11 @@ int gigabeat_code(char *infile, char *outfile)
out = openoutfile(outfile);
while (!feof(in)) {
bytes_read = fread(&data, 1, 4, in);
bytes_read = fread(buf, 1, 4, in);
/* Read in little-endian */
data = le2int(buf);
data = data ^ key;
key = key + (key << 1);
@ -65,7 +69,10 @@ int gigabeat_code(char *infile, char *outfile)
size += bytes_read;
fwrite(&data, 1, bytes_read, out);
/* Write out little-endian */
int2le(data, buf);
fwrite(buf, 1, bytes_read, out);
}
fprintf(stderr, "File processed successfully\n" );

View File

@ -52,6 +52,13 @@ void short2le(unsigned short val, unsigned char* addr)
addr[1] = (val >> 8) & 0xff;
}
unsigned int le2int(unsigned char* buf)
{
int32_t res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
return res;
}
void int2le(unsigned int val, unsigned char* addr)
{
addr[0] = val & 0xFF;