Sign in to follow this  
jor1980

from PHP to c#

Recommended Posts

jor1980    152
Hi, i have a class written in php used to decompress a file, and i need to use it in c#. i don´t know nothing about php and i would like to know if is there any tool to translate from php to c#.

Thank's

Share this post


Link to post
Share on other sites
jor1980    152
I have created a dll with phalanger, but i don´t know how to use one of tis classes in c#. I have read the documentation of phalanger but i still don´t understand it.

Supposing my php dll is named MyOwn.dll how i can use its claess in a c# project

Share this post


Link to post
Share on other sites
jor1980    152
Quote:
Original post by VirtualVoid
add reference to your project.

if you still don't get it you should learn some .NET/C# basics first.


I have use references many times, but the problem is that in c# doen´t recognize me the namespace of the php dll,Could the dll have a bug?

I have upload it to everyone who wants to try to add it as a reference to a c# project and access its namespace

http://hotfile.com/dl/76534071/828e7cb/DBunpack.dll.html

Share this post


Link to post
Share on other sites
jor1980    152
Quote:
Original post by phresnel
Where is that PHP source code?


in this link and also in this post: http://sims2wiki.info/wiki.php?title=DBPF/Source_Code

as i don´t know php i don´t know if this source only works with files it will work with a memorystream, because i will need to make it work with a memorystream



<?

class DBPFfile
{

var $majorVersion;
var $minorVersion;

var $reserved;

var $dateCreated;
var $dateModified;

var $indexMajorVersion;
var $indexMinorVersion;

var $indexCount;
var $indexOffset;
var $indexSize;

var $holesCount;
var $holesOffset;
var $holesSize;

var $reserved2;

var $indexData;


// ** Internally used I/O functions

// Reads a 4 byte unsigned integer
/*
Used internally by the class to read a C/C++
"unsigned long" (a 4 byte unsigned integer)
from an open file

$fh - the file handle from which to read
returns - returns the value read; has no error return
*/

function read_UL4($fh)
{
$d = fread($fh, 4);
$a = unpack("Vn", $d);
return $a["n"];
}

// Reads a 2 byte unsigned integer
/*
Used internally by the class to read a C/C++
"unsigned short" (a 2 byte unsigned integer)
from an open file

$fh - the file handle from which to read
returns - returns the value read; has no error return
*/

function read_UL2($fh)
{
$d = fread($fh, 2);
$a = unpack("vn", $d);
return $a["n"];
}

// Reads a 1 byte unsigned integer
/*
Used internally by the class to read a C/C++
"unsigned char" (a 1 byte unsigned integer)
from an open file

$fh - the file handle from which to read
returns - returns the value read; has no error return
*/

function read_UL1($fh)
{
$d = fread($fh, 1);
$a = unpack("Cn", $d);
return $a["n"];
}

// Reads a unicode string of specified length
/*
Used internally by the class to read a C/C++
array of "wchar_t" (a 2 byte character)
from an open file

$fh - the file handle from which to read
$len - the number of charatcers to read
returns - returns the value read; has no error return
*/

function read_unistr($fh, $len)
{
$s = "";
for($i = 0; $i < $len; ++$i)
{
$c = fread($fh, 1);
if(ord($c) != 0) $s .= $c;
fseek($fh, 1, SEEK_CUR);
}
return $s;
}

function read_nullstring($fh)
{
$s = "";
$str = fread($fh, 1);
while (ord($str) != 0)
{
$s .= $str;
$str = fread($fh, 1);
}

return $s;

}

// Reads a string length and then the string
/*
Used internally by the class to read a 4 byte unsigned integer
and then read a string that many characters in length

$fh - the file handle from which to read
returns - returns the string read (not the length read); has no error return
*/

function read_lenstr($fh)
{
$str_length = $this->read_UL4($fh);
$s = fread($fh, $str_length);
return $s;
}

// Reads a string length and then the unicode string
/*
Used internally by the class to read a 4 byte unsigned integer
and then read a unicode string that many characters in length

$fh - the file handle from which to read
returns - returns the unicode string read (not the length read); has no error return
*/

function read_lenwstr($fh)
{
$str_length = $this->read_UL4($fh);
$s = $this->read_unistr($fh, $str_length);
return $s;
}

function strhex($string)
{
$hex="";
for ($i=0;$i<strlen($string);$i++) $hex.=(strlen(dechex(ord($string[$i])))<2)? "0".dechex(ord($string[$i])): dechex(ord($string[$i]));
return $hex;
}

function hexstr($hex)
{
$string="";
for ($i=0;$i<strlen($hex)-1;$i+=2) $string.=chr(hexdec($hex[$i].$hex[$i+1]));
return $string;
}

// Reads a string and reverses it, taking into account hex groupings
/*
ie 2397586c becomes 6c589723
*/

function revhex($string)
{
for($i=0;$i<strlen($string)-1;$i+=2)
{
$revstring = $string[$i].$string[$i+1].$revstring;
}
return $revstring;
}

// Decompresses string
/*
PHP DBPF decompression by Delphy

Thanks to dmchess (http://hullabaloo.simshost.com/forum/viewtopic.php?t=6578&postdays=0&postorder=asc)
for the Perl code that I used for this

$handle - file handle for reading
$len - length of compressed string

*/

function decompress($handle, $len) {

$buf = '';
$answer = "";
$answerlen = 0;
$numplain = "";
$numcopy = "";
$offset = "";

for (;$len>0;) {

$cc = $this->read_UL1($handle);
$len -= 1;

// echo $cc."<br />\n";

// printf(" Control char is %02x, len remaining is %08x. \n",$cc,$len);
if ($cc >= 252): // 0xFC
$numplain = $cc & 0x03;
if ($numplain > $len) { $numplain = $len; }
//$numplain = $len if ($numplain > $len);
$numcopy = 0;
$offset = 0;
elseif ($cc >= 224): // 0xE0
$numplain = ($cc - 0xdf) << 2;
$numcopy = 0;
$offset = 0;
elseif ($cc >= 192): // 0xC0
$len -= 3;

/*
$buf = fread($handle, 1);
$byte1 = unpack("C", $buf);
$buf = fread($handle, 1);
$byte2 = unpack("C", $buf);
$buf = fread($handle, 1);
$byte3 = unpack("C", $buf);
*/


$byte1 = $this->read_UL1($handle);
$byte2 = $this->read_UL1($handle);
$byte3 = $this->read_UL1($handle);

$numplain = $cc & 0x03;
$numcopy = (($cc & 0x0c) <<6) + 5 + $byte3;
$offset = (($cc & 0x10) << 12 ) + ($byte1 << 8) + $byte2;
elseif ($cc >= 128): // 0x80
$len -= 2;

/*
$buf = fread($handle, 1);
$byte1 = unpack("C", $buf);
$buf = fread($handle, 1);
$byte2 = unpack("C", $buf);
*/


$byte1 = $this->read_UL1($handle);
$byte2 = $this->read_UL1($handle);

$numplain = ($byte1 & 0xc0) >> 6;
$numcopy = ($cc & 0x3f) + 4;
$offset = (($byte1 & 0x3f) << 8) + $byte2;
else:
$len -= 1;

$byte1 = $this->read_UL1($handle);
//$buf = fread($handle, 1);
//$byte1 = unpack("C", $buf);

$numplain = ($cc & 0x03);
$numcopy = (($cc & 0x1c) >> 2) + 3;
$offset = (($cc & 0x60) << 3) + $byte1;
endif;

# printf " plain, copy, offset: $numplain, $numcopy, $offset \n";
// echo " plain, copy, offset: $numplain, $numcopy, $offset \n";
$len -= $numplain;

// echo $numplain." -- ".$len."<br />\n";

if ($numplain > 0) {
$buf = fread($handle, $numplain);
$answer = $answer.$buf;
}

$fromoffset = strlen($answer) - ($offset + 1); # 0 == last char
for ($i=0;$i<$numcopy;$i++) {
$answer = $answer.substr($answer,$fromoffset+$i,1);
}

$answerlen += $numplain;
$answerlen += $numcopy;
}
//printf " Answer length is %08x (%08x). \n",$answerlen,length($answer);

return $answer;
}

// Loads a DBPF file
/*
$fileName - the name of a file to open
returns - true on success, a string value on error (use $ret === true to test for success or failure)
*/

function loadFile($handle, $offset = 0)
{
// $this->m_fileName = $fileName;

// $handle = fopen($fileName, "rwb");
if($handle)
{

echo "Reading from offset: ".$offset."<br />";

$start = $offset;
if ($offset > 0) {
fseek($handle, $offset);
}

$test = fread($handle, 4); // Should be DBPF

if ($test != "DBPF") { echo $test." - This is not a DBPF file!"; return; }

$this->majorVersion = $this->read_UL4($handle);
$this->minorVersion = $this->read_UL4($handle);

$this->reserved = fread($handle, 12);

$this->dateCreated = $this->read_UL4($handle);
$this->dateModified = $this->read_UL4($handle);

$this->indexMajorVersion = $this->read_UL4($handle);
$this->indexCount = $this->read_UL4($handle);
$this->indexOffset = $this->read_UL4($handle);
$this->indexSize = $this->read_UL4($handle);

$this->holesCount = $this->read_UL4($handle);
$this->holesOffset = $this->read_UL4($handle);
$this->holesSize = $this->read_UL4($handle);

$this->indexMinorVersion = $this->read_UL4($handle) - 1;

$this->reserved2 = fread($handle, 32);

$headerEnd = ftell($handle);

// Seek to index
fseek($handle, $offset + $this->indexOffset);
// echo ftell($handle)."\n";

for ($i=0;$i < $this->indexCount;$i++) {
$indexData[$i]['typeID'] = $this->revhex($this->strhex(fread($handle, 4)));
$indexData[$i]['groupID'] = $this->revhex($this->strhex(fread($handle, 4)));
$indexData[$i]['instanceID'] = $this->revhex($this->strhex(fread($handle, 4)));

if (($this->indexMajorVersion == "7") && ($this->indexMinorVersion == "1")) {
$indexData[$i]['instanceID2'] = $this->revhex($this->strhex(fread($handle, 4)));
}
$indexData[$i]['offset'] = $this->read_UL4($handle);
$indexData[$i]['filesize'] = $this->read_UL4($handle);
$indexData[$i]['compressed'] = false;
$indexData[$i]['truesize'] = 0;
}

//echo print_r($indexData, true)."\n";

// First check for a DIR resource
foreach($indexData as $value) {
if ($value['typeID'] == 'e86b1eef') {
//echo "Getting DIR resource of size ".$value['filesize']."... <br />";
fseek($handle, $offset + $value['offset']);

// Each record in a Sims 2 file is 20 bytes long, so to get the total number of records we
// divide $value['filsize'] by 20.
if (($this->indexMajorVersion == "7") && ($this->indexMinorVersion == "1")) {
$numRecords = ($value['filesize'] / 20);
} else {
$numRecords = ($value['filesize'] / 16);
}

for ($i=0;$i < $numRecords; $i++) {
$typeID = $this->revhex($this->strhex(fread($handle, 4)));
$groupID = $this->revhex($this->strhex(fread($handle, 4)));
$instanceID = $this->revhex($this->strhex(fread($handle, 4)));
if (($this->indexMajorVersion == "7") && ($this->indexMinorVersion == "1")) {
$instanceID2 = $this->revhex($this->strhex(fread($handle, 4)));
}
$filesize_nc = $this->read_UL4($handle);

for ($j=0; $j < $this->indexCount; $j++) {
if ($indexData[$j]['typeID'] == $typeID) {
if ($indexData[$j]['groupID'] == $groupID) {
if ($indexData[$j]['instanceID'] == $instanceID) {
if (($this->indexMajorVersion == "7") && ($this->indexMinorVersion == "1")) {
if ($indexData[$j]['instanceID2'] == $instanceID2) {
$indexData[$j]['compressed'] = true;
$indexData[$j]['truesize'] = $filesize_nc;
}
} else {
$indexData[$j]['compressed'] = true;
$indexData[$j]['truesize'] = $filesize_nc;
}
}
}
}
}

}

}
}

foreach($indexData as $value) {

/* Catalog Description - CTSS */
if ($value['typeID'] == '43545353') {
//echo "Grabbing CTSS file at offset ".$value['offset']." (".($offset + $value['offset']).")...<br />";
fseek($handle, $offset + $value['offset']);

fread($handle, 64);

fread($handle, 2); // FormatCode
$numStrings = $this->read_UL2($handle);
//echo "NumStrings: ".$numStrings."<br />";

$numStrings = 2;
for ($j = 0; $j < $numStrings; $j++)
{

$stringPairs = $this->read_UL1($handle);
//echo "NumStringPairs: ".$stringPairs."<br />";
//for ($i = 0; $i < $stringPairs; $i++)
//{
$ret .= $this->read_nullstring ($handle);
if ($j == 0) { $ret .= "<br />"; }
echo "...".$ret." - ";
$ret2 = $this->read_nullstring($handle);
//echo $ret2."<br />";
//}
}

}

/* Object XML */
if ($value['typeID'] == 'cca8e925') {
if ($value['compressed'] == true) {
fseek($handle, $offset + $value['offset']);
$dword = $this->read_UL4($handle);
//$dword = fread($handle, 4);
$data = fread($handle, 5);

//echo $dword."<br /> \n ";
//echo $data."<br /> \n ";
//echo "decompressing file... <br />";
$xmldata = $this->decompress($handle, $dword - 9);

$objXML = new xml2Array();
$arrOutput2 = $objXML->parse($xmldata);

foreach ($arrOutput2[CGZPROPERTYSETSTRING][ANYSTRING] as $value) {
if ($value[KEY] == 'description') {
$ret = $value[DATA];
echo "-- ".$value[DATA]."<br />";
}
}

}
}


}

if ($ret == '') {
foreach ($indexData as $value) {

/* String Text Lists - STR# */
if ($value['typeID'] == '53545223') {
echo "Grabbing STR# file at offset ".$value['offset']." (".($offset + $value['offset']).")...\n";
fseek($handle, $offset + $value['offset']);

if ($value['compressed'] == true) {
fseek($handle, $offset + $value['offset']);
$dword = $this->read_UL4($handle);
//$dword = fread($handle, 4);
$data = fread($handle, 5);

//echo $dword."<br /> \n ";
//echo $data."<br /> \n ";
//echo "decompressing file... <br />";
$data = $this->decompress($handle, $dword - 9);

// $data now contains the decompressed data so we have to get the string pairs from it

//echo strlen($data)."\n";

//if (strlen($data) > 66) {
// First, chop off the filename of 64 bytes
$data = substr($data, 64);
//}

// Next, the FormatCode (2 bytes)
$data = substr($data, 2);

//echo $data."\n";

$numStrings = unpack("vn", substr($data, 0, 2));
//echo "NumStrings: ".$numStrings."\n";

$numStrings = 2;
$soffset = 2;
for ($j = 0; $j < $numStrings; $j++)
{

if ($soffset < strlen($data)) {

$languageCode = unpack("Cn", substr($data, $soffset, 1));
$soffset++;

// Grab string pair
for ($l=0; $l < 2; $l++) {
$k = 0;
for (;$k < 1;) {
$tempstring = substr($data, $soffset, 1);
if (ord($tempstring) != 0) {
$ret .= $tempstring;
} else {
$k = 1;
}
$soffset++;
}

}

//$ret .= $this->read_nullstring ($handle);
if ($j == 0) { $ret .= "<br />"; }
echo "...".$ret." - ";
//$ret2 = $this->read_nullstring($handle);
//echo $ret2."<br />";
}

}
} else {
fseek($handle, $offset + $value['offset']);

fread($handle, 64);

fread($handle, 2); // FormatCode
$numStrings = $this->read_UL2($handle);
//echo "NumStrings: ".$numStrings."<br />";

$numStrings = 2;
for ($j = 0; $j < $numStrings; $j++)
{

$languageCode = $this->read_UL1($handle);
$ret .= $this->read_nullstring ($handle);
if ($j == 0) { $ret .= "<br />"; }
echo "...".$ret." - ";
$ret2 = $this->read_nullstring($handle);
//echo $ret2."<br />";
}

}

}

} }


return $ret;
}
else
{
return "Could not open file '" . $fileName . "'";
}

}


}

?>



[Edited by - jor1980 on October 19, 2010 3:25:54 AM]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this