⑴ php接收二進制文件怎麼替換裡面的內容
php接收二進制文件怎麼替換裡面的內容
php接收二進制文件如下:
<?php
header('Content-type: text/html; charset=utf-8');
error_reporting(0);
$filename = $_GET["filename"];
$filesize = $_GET["filesize"];
$xmlstr = $GLOBALS[HTTP_RAW_POST_DATA];//$_POST["data"];//
if(empty($xmlstr)) $xmlstr = file_get_contents('php://input');
$raw = $xmlstr;//得到post過來的二進制原始數據
$file = fopen("./upload/".$filename,"w");//打開文件准備寫入
fwrite($file,$raw);//寫入
fclose($file);//關閉
?>
接收的二進制文件中非標准字元(>0x7F)的位元組被替換為三個位元組,比如E2替換為EF 9F A2
現在我想在Php接收到文件之後還原回去,把EF 9F A2替換為E2,請問這個怎麼實現?
非常感謝!
PHP 二進制
------解決方案--------------------
他的數據轉換規則是這樣的:
文件頭不變,文件頭多長不清楚,圖上到0050h都一樣的
<=7F的位元組,因為utf-8也一樣,可以認為也轉換了utf-8
>=80的位元組,高位加上F7,再轉utf-8,例如E2就變成F7E2然後轉utf-8成為EF 9F A2
至少他圖中E2/FB/91/B2/81...都滿足這個規則
------解決方案--------------------
本帖最後由 xuzuning 於 2013-05-02 15:35:02 編輯
用正則可這樣寫
假定數據已把存在變數 $s 中,則
$s = preg_replace_callback('/[\xef]../', 'foo', $s);
function foo($r) {
$c = (ord($r[0]{1}) & 0x03) << 6;
$c += (ord($r[0]{2}) & 0x3f);
return chr($c);
}
⑵ php腳本編程技術打開一個二進制文件,修改了內容如何再保存回去呢
b
表示二進制方式,window
下必須嚴格區別,linux
下無所謂2、處理後的
$word
的內容是十六進製表示,你在寫入文件時並沒有再轉回二進制1、既然你用
$fp=fopen("sample.bin",'rb');
打開文件,表示你的程序可在
window
系統下工作,那麼寫入時也應
$new=
fopen('new.bin','wb');可用
$word
=
pack('H*',
$word);
轉換
⑶ php如何打開在mysql中取出的二進制數據
你好,像製作驗證碼那樣
把位元組流扔進一個圖片類型的文件里,然後就可以了
希望能解決你的問題,望採納
⑷ PHP 字元串 二進制
不知道樓主問的是不是php中把字元串轉換成二進制的函數?如果是的話,可以進行如下處理
ASCII(str)
返回字元串str的最左面字元的ASCII代碼值。如果str是空字元串,返回0。如果str是NULL,返回NULL。
ORD(str)
如果字元串str最左面字元是一個多位元組字元,通過以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字元的ASCII代碼值來返回多位元組字元代碼。如果最左面的字元不是一個多位元組字元。返回與ASCII()函數返回的相同值。
CONV(N,from_base,to_base)
在不同的數字基之間變換數字。返回數字N的字元串數字,從from_base基變換為to_base基,如果任何參數是NULL,返回NULL。參數N解釋為一個整數,但是可以指定為一個整數或一個字元串。最小基是2且最大的基是36。如果to_base是一個負數,N被認為是一個有符號數,否則,N被當作無符號數。 CONV以64位點精度工作。
BIN(N)
返回二進制值N的一個字元串表示,在此N是一個長整數(BIGINT)數字,這等價於CONV(N,10,2)。如果N是NULL,返回NULL。
OCT(N)
返回八進制值N的一個字元串的表示,在此N是一個長整型數字,這等價於CONV(N,10,8)。如果N是NULL,返回NULL。
HEX(N)
返回十六進制值N一個字元串的表示,在此N是一個長整型(BIGINT)數字,這等價於CONV(N,10,16)。如果N是NULL,返回NULL。
CHAR(N,...)
CHAR()將參數解釋為整數並且返回由這些整數的ASCII代碼字元組成的一個字元串。NULL值被跳過。
CONCAT(str1,str2,...)
返回來自於參數連結的字元串。如果任何參數是NULL,返回NULL。可以有超過2個的參數。一個數字參數被變換為等價的字元串形式。
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
返回字元串str的長度。
LOCATE(substr,str)
POSITION(substr IN str)
返回子串substr在字元串str第一個出現的位置,如果substr不是在str裡面,返回0.
LOCATE(substr,str,pos)
返回子串substr在字元串str第一個出現的位置,從位置pos開始。如果substr不是在str裡面,返回0。
INSTR(str,substr)
返回子串substr在字元串str中的第一個出現的位置。這與有2個參數形式的LOCATE()相同,除了參數被顛倒。
LPAD(str,len,padstr)
返回字元串str,左面用字元串padstr填補直到str是len個字元長。
RPAD(str,len,padstr)
返回字元串str,右面用字元串padstr填補直到str是len個字元長。
LEFT(str,len)
返回字元串str的最左面len個字元。
RIGHT(str,len)
返回字元串str的最右面len個字元。
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
從字元串str返回一個len個字元的子串,從位置pos開始。使用FROM的變種形式是ANSI SQL92語法。
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
從字元串str的起始位置pos返回一個子串。
SUBSTRING_INDEX(str,delim,count)
返回從字元串str的第count個出現的分隔符delim之後的子串。如果count是正數,返回最後的分隔符到左邊(從左邊數) 的所有字元。如果count是負數,返回最後的分隔符到右邊的所有字元(從右邊數)。
LTRIM(str)
返回刪除了其前置空格字元的字元串str。
RTRIM(str)
返回刪除了其拖後空格字元的字元串str。
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
返回字元串str,其所有remstr前綴或後綴被刪除了。如果沒有修飾符BOTH、LEADING或TRAILING給出,BOTH被假定。如果remstr沒被指定,空格被刪除。
SOUNDEX(str)
返回str的一個同音字元串。聽起來「大致相同」的2個字元串應該有相同的同音字元串。一個「標准」的同音字元串長是4個字元,但是SOUNDEX()函數返回一個任意長的字元串。你可以在結果上使用SUBSTRING()得到一個「標准」的 同音串。所有非數字字母字元在給定的字元串中被忽略。所有在A-Z之外的字元國際字母被當作母音。
SPACE(N)
返回由N個空格字元組成的一個字元串。
REPLACE(str,from_str,to_str)
返回字元串str,其字元串from_str的所有出現由字元串to_str代替。
REPEAT(str,count)
返回由重復countTimes次的字元串str組成的一個字元串。如果count <= 0,返回一個空字元串。如果str或count是NULL,返回NULL。
REVERSE(str)
返回顛倒字元順序的字元串str。
INSERT(str,pos,len,newstr)
返回字元串str,在位置pos起始的子串且len個字元長得子串由字元串newstr代替。
ELT(N,str1,str2,str3,...)
如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小於1或大於參數個數,返回NULL。ELT()是FIELD()反運算。
FIELD(str,str1,str2,str3,...)
返回str在str1, str2, str3, ...清單的索引。如果str沒找到,返回0。FIELD()是ELT()反運算。
FIND_IN_SET(str,strlist)
如果字元串str在由N子串組成的表strlist之中,返回一個1到N的值。一個字元串表是被「,」分隔的子串組成的一個字元串。如果第一個參數是一個常數字元串並且第二個參數是一種類型為SET的列,FIND_IN_SET()函數被優化而使用位運算!如果str不是在strlist裡面或如果strlist是空字元串,返回0。如果任何一個參數是NULL,返回NULL。如果第一個參數包含一個「,」,該函數將工作不正常。
MAKE_SET(bits,str1,str2,...)
返回一個集合 (包含由「,」字元分隔的子串組成的一個字元串),由相應的位在bits集合中的的字元串組成。str1對應於位0,str2對應位1,等等。在str1, str2, ...中的NULL串不添加到結果中。
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
返回一個字元串,在這里對於在「bits」中設定每一位,你得到一個「on」字元串,並且對於每個復位(reset)的位,你得到一個「off」字元串。每個字元串用「separator」分隔(預設「,」),並且只有「bits」的「number_of_bits」 (預設64)位被使用。
LCASE(str)
LOWER(str)
返回字元串str,根據當前字元集映射(預設是ISO-8859-1 Latin1)把所有的字元改變成小寫。該函數對多位元組是可靠的。
UCASE(str)
UPPER(str)
返回字元串str,根據當前字元集映射(預設是ISO-8859-1 Latin1)把所有的字元改變成大寫。該函數對多位元組是可靠的。
LOAD_FILE(file_name)
讀入文件並且作為一個字元串返迴文件內容。文件必須在伺服器上,你必須指定到文件的完整路徑名,而且你必須有file許可權。文件必須所有內容都是可讀的並且小於max_allowed_packet。如果文件不存在或由於上面原因之一不能被讀出,函數返回NULL。
另外,MySQL必要時自動變換數字為字元串,並且反過來也如此:
mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'
如果你想要明確地變換一個數字到一個字元串,把它作為參數傳遞到CONCAT()。
如果字元串函數提供一個二進制字元串作為參數,結果字元串也是一個二進制字元串。被變換到一個字元串的數字被當作是一個二進制字元串。這僅影響比較。
終於打完了,樓主如果還需要其他解釋請提出來
⑸ PHP中怎麼以二進制形式表示數字
需要准備的材料分別是:電腦、php編輯器、瀏覽器。
1、首先,打開php編輯器,新建php文件,例如:index.php。

⑹ php怎樣將二進制流存到文件中
整形轉化成2二進制可以用base_convert:
$str=0x8000;
echo$str2=base_convert($str,16,2);
echo'<br>';
echobase_convert($str2,2,16);
[code]
字元串文件等可以考慮用pack和unpack轉化成二進制
[code=PHP]
$file1='F:/46.gif';//隨便拷一個圖片作為測試用
$file2='F:/test.txt';//生成的二進制流保存在這個文件里
$file3='F:/47.gif';//由二進制流還原成的文件
$size=filesize($file1);
echo'文件大小為:'.$size;
echo"
<br>轉化為二進制...";
$content=file_get_contents($file1);
$content=bstr2bin($content);
$fp=fopen($file2,'w');
fwrite($fp,$content);
fclose($fp);
$size2=filesize($file2);
echo'轉化成二進制後文件大小為:'.$size2;
$content=bin2bstr($content);
$fp=fopen($file3,'w');
fwrite($fp,$content);
fclose($fp);
functionbin2bstr($input)
//Convertabinaryexpression(e.g.,"100111")intoabinary-string
{
if(!is_string($input))returnnull;//Sanitycheck
//Packintoastring
$input=str_split($input,4);
$str='';
foreach($inputas$v)
{
$str.=base_convert($v,2,16);
}
$str=pack('H*',$str);
return$str;
}
functionbstr2bin($input)
//Binaryrepresentationofabinary-string
{
if(!is_string($input))returnnull;//Sanitycheck
//Unpackasahexadecimalstring
$value=unpack('H*',$input);
//Outputbinaryrepresentation
$value=str_split($value[1],1);
$bin='';
foreach($valueas$v)
{
$b=str_pad(base_convert($v,16,2),4,'0',STR_PAD_LEFT);
$bin.=$b;
}
return$bin;
}
⑺ php 圖片以二進制流的形式存入資料庫。並且能顯示出來。
這個真不會。
⑻ 急求php中如何存取二進制文件(如AutoCAD圖)分不夠就加!!!
<?php
$user='root';
$password='root';
$db='test';
$connect=mysql_connect('localhost',$user,$password);
mysql_set_charset('utf8',$connect);
mysql_select_db($db);
$photo = "0x".bin2hex(file_get_contents("./test.jpg"));
$sql="INSERT INTO `test`.`test` (`photo`) VALUES ($photo);";//$photo不需要用引號,切記
mysql_query($sql);
//$result=mysql_query("SELECT *
//FROM `test`
//LIMIT 0 , 30");
//$img=mysql_fetch_array($result);
//echo $img['photo'];
?>
⑼ PHP關於獲取二進制數據流轉換為文件的方法
$content=$_POST['data'];
$fp=fopen('/tmp/newfile.bin','w');
fwrite($fp,$content);
以上例子是在data參數上傳二進制,並保存到/tmp/newfile.bin中,解析json用json_decode,然後把二進制的那個值賦給content就可以
⑽ php中如何把一個文本內容保存成一個二進制文件
用fopen($filename,"w")或fopen($filename,"w+"),具體用法你看一下php手冊,寫得很明白,不太難