header.c

来自「nbfdec是可以把PPC上的rom由nbf转换为nba文件工具,支持自动查询解」· C语言 代码 · 共 82 行

C
82
字号
#include "project.h"


static UCHAR rev_xlat_tbl[0x40] = 
	"yz98765432UVWXYZabcdKLMNOPQRSTopqrstuvwxefghijklmnABCDEFGHIJ10+/";

static UCHAR xlat_tbl[0x100];

VOID
HeaderCryptInit(
				VOID
				)
{
	SIZE_T i;
	memset(xlat_tbl, 0x2A, 0x80);
	for( i = 0; i < 64; ++i ) {
		xlat_tbl[rev_xlat_tbl[i]] = (UCHAR)i;
	}
}

VOID
HeaderDecrypt(
			  IN PVOID	p_src,
			  IN SIZE_T	cbSrc,
			  IN PVOID	p_dst,
			  IN SIZE_T	cbDst
			  )
{
	PUCHAR src = p_src;
	PUCHAR dst = p_dst;
	const SIZE_T cSrcBits = 6;
	const SIZE_T cDstBits = 8;
	SIZE_T	cBit = 0;
	memset( dst, 0, cbDst );
	while( ( cBit / cSrcBits ) < cbSrc && ( cBit / cDstBits ) < cbDst ) {
		BOOLEAN bit = !!( xlat_tbl[ src[ cBit / cSrcBits ] ] & ( 1 << ( (cSrcBits - 1) - ( cBit % cSrcBits ) ) ) );
		dst[ cBit / cDstBits ] |= ( bit << ( (cDstBits - 1) - ( cBit % cDstBits ) ) );
		++cBit;
	}
}

VOID
HeaderEncrypt(
			  IN PVOID 	p_src,
			  IN SIZE_T	cbSrc,
			  IN PVOID	p_dst,
			  IN SIZE_T	cbDst
			  )
{
	PUCHAR src = p_src;
	PUCHAR dst = p_dst;
	const SIZE_T cSrcBits = 8;
	const SIZE_T cDstBits = 6;
	SIZE_T	cBit = 0;
	memset( dst, 0, cbDst );
	while( ( cBit / cSrcBits ) < cbSrc && ( cBit / cDstBits ) < cbDst ) {
		BOOLEAN bit = !!( src[ cBit / cSrcBits ] & ( 1 << ( (cSrcBits - 1) - ( cBit % cSrcBits ) ) ) );
		dst[ cBit / cDstBits ] |= ( bit << ( (cDstBits - 1) - ( cBit % cDstBits ) ) );
		++cBit;
	}
	while( cbDst-- ) {
		*dst++ = rev_xlat_tbl[*dst];
	}
	*--dst = 0x3D;
}

VOID
HeaderDump(
		   IN PNBF_HEADER nbfHeader
		   )
{
#define PRINT_FIELD(x) printf(#x "=%.*s\n", sizeof(nbfHeader->##x), nbfHeader->##x);
	PRINT_FIELD(deviceId);
	PRINT_FIELD(cellOpName);
	PRINT_FIELD(language);
	PRINT_FIELD(firmwareVersion);
	PRINT_FIELD(deviceModelName);
	PRINT_FIELD(address0);
	PRINT_FIELD(address1);
	PRINT_FIELD(address2);
	PRINT_FIELD(crc32);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?