當前位置:首頁 » 編程語言 » phpbyte數組

phpbyte數組

發布時間: 2023-08-21 12:03:19

java getBytes等同於php的什麼

<?php

/**

* byte數組與字元串轉化類

*/

class Bytes {

/**

* 轉換一個String字元串為byte數組

* @param $str 需要轉換的字元串

* @param $bytes 目標byte數組

* @author Zikie

*/
public static function getBytes($string) {
$bytes = array();
for($i = 0; $i < strlen($string); $i++){
$bytes[] = ord($string[$i]);
}
return $bytes;
}

/**

* 將位元組數組轉化為String類型的數據

* @param $bytes 位元組數組

* @param $str 目標字元串

* @return 一個String類型的數據

*/

public static function toStr($bytes) {
$str = '';
foreach($bytes as $ch) {
$str .= chr($ch);
}

return $str;
}

/**

* 轉換一個int為byte數組

* @param $byt 目標byte數組

* @param $val 需要轉換的字元串

*

*/

public static function integerToBytes($val) {
$byt = array();
$byt[0] = ($val & 0xff);
$byt[1] = ($val >> 8 & 0xff);
$byt[2] = ($val >> 16 & 0xff);
$byt[3] = ($val >> 24 & 0xff);
return $byt;
}

/**

* 從位元組數組中指定的位置讀取一個Integer類型的數據

* @param $bytes 位元組數組

* @param $position 指定的開始位置

* @return 一個Integer類型的數據

*/

public static function bytesToInteger($bytes, $position) {
$val = 0;
$val = $bytes[$position + 3] & 0xff;
$val <<= 8;
$val |= $bytes[$position + 2] & 0xff;
$val <<= 8;
$val |= $bytes[$position + 1] & 0xff;
$val <<= 8;
$val |= $bytes[$position] & 0xff;
return $val;
}

/**

* 轉換一個shor字元串為byte數組

* @param $byt 目標byte數組

* @param $val 需要轉換的字元串

*

*/

public static function shortToBytes($val) {
$byt = array();
$byt[0] = ($val & 0xff);
$byt[1] = ($val >> 8 & 0xff);
return $byt;
}

/**

* 從位元組數組中指定的位置讀取一個Short類型的數據。

* @param $bytes 位元組數組

* @param $position 指定的開始位置

* @return 一個Short類型的數據

*/

public static function bytesToShort($bytes, $position) {
$val = 0;
$val = $bytes[$position + 1] & 0xFF;
$val = $val << 8;
$val |= $bytes[$position] & 0xFF;
return $val;
}

}

② 在php中,怎樣把字元串轉為UTF-8位元組數組

設置編碼utf-8
mysql_query('set
names
utf8');
或者是
header("content-type:
text/html;
charset=utf-8");
這個放在頭部(之前不能有輸出)

③ php里位元組數組 怎麼理解

PHP的字元串都是位元組數組(或者叫位元組串)。傳言到PHP6 會改成真正的unicode字元串,但目前PHP4、5的字元串都只是位元組串。
$a='你好';
echo $a[0];//這時顯示的是一個位元組,而不是字元『你』

PHP中所有的字元串函數,比如substr、strpos、strcmp等等都註明了「binary-safe二進制安全」,表明這些函數只是處理位元組,而非處理字元。

形成的原因:PHP早期和C一樣,僅僅兼容ASCII碼,而ASCII碼的一個字元等同一個位元組。
所以目前PHP的字元和位元組是基本同義的,處理中文需要multibyte char多位元組字元的MB模塊。
到PHP6才會改變

④ php怎麼查看一個變數的佔用內存

我們在前面的php高效寫法提到,盡量不要復制變數,特別是數組。一般來說,PHP數組的內存利用率只有 1/10, 也就是說,一個在C語言裡面100M 內存的數組,在PHP裡面就要1G。下面我們可以粗略的估算PHP數組佔用內存的大小,首先我們測試1000個元素的整數佔用的內存:

[php] view plain print?
<?php
echo memory_get_usage() , '<br>';
$start = memory_get_usage();
$a = Array();
for ($i=0; $i<1000; $i++) {
$a[$i] = $i + $i;
}
$mid = memory_get_usage();
echo memory_get_usage() , '<br>';
for ($i=1000; $i<2000; $i++) {
$a[$i] = $i + $i;
}
$end = memory_get_usage();
echo memory_get_usage() , '<br>';
echo 'argv:', ($mid - $start)/1000 ,'bytes' , '<br>';
echo 'argv:',($end - $mid)/1000 ,'bytes' , '<br>';

輸出是:

353352
437848
522024
argv:84.416bytes
argv:84.176bytes

大概了解1000
個元素的整數數組需要佔用 82k 內存,平均每個元素佔用 84 個位元組。而純 C 中整體只需要 4k(一個整型佔用4byte * 1000
)。memory_get_usage() 返回的結果並不是全是被數組佔用了,還要包括一些 PHP
運行本身分配的一些結構,可能用內置函數生成的數組更接近真實的空間:

[php] view plain print?
<?php
$start = memory_get_usage();
$a = array_fill(0, 10000, 1);
$mid = memory_get_usage(); //10k elements array;
echo 'argv:', ($mid - $start )/10000,'byte' , '<br>';
$b = array_fill(0, 10000, 1);
$end = memory_get_usage(); //10k elements array;
echo 'argv:', ($end - $mid)/10000 ,'byte' , '<br>';

得到:
argv:54.5792byte
argv:54.5784byte

從這個結果來看似乎一個數組元素大約佔用了54個位元組左右。

首先看一下32位機C語言各種類型佔用的位元組:

[cpp] view plain print?
#include "stdafx.h"
//#include <stdio.h>

int main() {
printf("int:%d\nlong:%d\ndouble:%d\nchar*:%d\nsize_t:%d\n",
sizeof(int), sizeof(long),
sizeof(double), sizeof(char *),
sizeof(size_t));
return 0;
}

int:4
long:4
double:8
har*:4
size_t:4
在PHP中都使用long類型來代表數字,沒有使用int類型
大家都明白PHP是一種弱類型的語言,它不會去區分變數的類型,沒有int float char *之類的概念。
我們看看php在zend裡面存儲的變數,PHP中每個變數都有對應的 zval, Zval結構體定義在Zend/zend.h裡面,其結構:

[cpp] view plain print?
typedef struct _zval_struct zval;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* The value 1 12位元組(32位機是12,64位機需要8+4+4=16) */
zend_uint refcount__gc; /* The number of references to this value (for GC) 4位元組 */
zend_uchar type; /* The active type 1位元組*/
zend_uchar is_ref__gc; /* Whether this value is a reference (&) 1位元組*/
};

PHP使用一種UNION結構來存儲變數的值,即zvalue_value 是一個union,UNION變數所佔用的內存是由最大

成員數據空間決定。

[cpp] view plain print?
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct { /* string value */
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj; /*object value */
} zvalue_value;

最大成員數據空間是struct str,指針占*val用4位元組,INT佔用4位元組,共8位元組。

struct zval佔用的空間為8+4+1+1 = 14位元組,

其實呢,在zval中數組,字元串和對象還需要另外的存儲結構,數組則是一個 HashTable:

HashTable結構體定義在Zend/zend_hash.h.

[cpp] view plain print?
typedef struct _hashtable {
uint nTableSize;//4
uint nTableMask;//4
uint nNumOfElements;//4
ulong nNextFreeElement;//4
Bucket *pInternalPointer; /* Used for element traversal 4*/
Bucket *pListHead;//4
Bucket *pListTail;//4
Bucket **arBuckets;//4
dtor_func_t pDestructor;//4
zend_bool persistent;//1
unsigned char nApplyCount;//1
zend_bool bApplyProtection;//1
#if ZEND_DEBUG
int inconsistent;//4
#endif
} HashTable;
HashTable 結構需要 39 個位元組,每個數組元素存儲在 Bucket 結構中:

[cpp] view plain print?
typedef struct bucket {
ulong h; /* Used for numeric indexing 4位元組 */
uint nKeyLength; /* The length of the key (for string keys) 4位元組 */
void *pData; /* 4位元組*/
void *pDataPtr; /* 4位元組*/
struct bucket *pListNext; /* PHP arrays are ordered. This gives the next element in that order4位元組*/
struct bucket *pListLast; /* and this gives the previous element 4位元組 */
struct bucket *pNext; /* The next element in this (doubly) linked list 4位元組*/
struct bucket *pLast; /* The previous element in this (doubly) linked list 4位元組*/
char arKey[1]; /* Must be last element 1位元組*/
} Bucket;

Bucket
結構需要 33 個位元組,鍵長超過四個位元組的部分附加在 Bucket 後面,而元素值很可能是一個 zval 結構,另外每個數組會分配一個由
arBuckets 指向的 Bucket 指針數組, 雖然不能說每增加一個元素就需要一個指針,但是實際情況可能更糟。這么算來一個數組元素就會佔用
54 個位元組,與上面的估算幾乎一樣。

一個空數組至少會佔用 14(zval) + 39(HashTable) + 33(arBuckets) = 86
個位元組,作為一個變數應該在符號表中有個位置,也是一個數組元素,因此一個空數組變數需要 118
個位元組來描述和存儲。從空間的角度來看,小型數組平均代價較大,當然一個腳本中不會充斥數量很大的小型數組,可以以較小的空間代價來獲取編程上的快捷。但如果將數組當作容器來使用就是另一番景象了,實際應用經常會遇到多維數組,而且元素居多。比如10k個元素的一維數組大概消耗540k內存,而10k
x 10 的二維數組理論上只需要 6M 左右的空間,但是按照 memory_get_usage
的結果則兩倍於此,[10k,5,2]的三維數組居然消耗了23M,小型數組果然是劃不來的。

⑤ 求指教!,php如何把字元串轉化為位元組數組呢

將一個字元串分解成一個字元串數組,這種分割可能是基於某個字元,比如說是空格,逗號,分號之類的話,你可以用PHP的字元串分割函數 explode(),語法是PHP code?

1、array explode ( string separator, string string [, int limit])
函數的第一個參數是分割符,第二個就是字元串了,具體可以參考一下PHP手冊
2、
<?php
function string2bytes($str){
$bytes=array();
for ($i=0; $i < strlen($str); $i++) {
$tmp=substr($str, $i,1);
$bytes[]=bin2hex($tmp);
}
return $bytes;
}

$b=string2bytes("崑山二手車ello,world");
var_mp($b);

⑥ 現在想用php端做一個流媒體出來(m3u8),一點思路也沒有,大家給點意見好嗎

首先是要搞清m3u8文件頭信息,然後可以用二進制位元組數組來實現,如我用二進製做的圖片程序:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Diagnostics;
namespace BMP
{
class Program
{
static void Main(string[] args)
{
int w = 800; int h =600;
//BMP文件頭信息:
long s3 = w * h * 3;
byte[] b = new byte[s3 + 54]; //image.bmp圖片文件總位元組數;
putByte(18, w, b);
putByte(22, h, b);
putByte(34, s3, b);
putByte(2, s3 + 54, b);
putByte(0, 0x42, b);
putByte(1, 0x4d, b);
putByte(10, 0x36, b);
putByte(14, 0x28, b);
putByte(26, 0x01, b);
putByte(28, 0x18, b);
//查看BMP頭文件:
//for (int i = 0; i < 0x36;i++ )
//{
//Console.Write("{1:X2},",b[i]);
// if ((i+1) % 16 == 0) Console.WriteLine();
//}
//對各像素顏色賦值(上背景色):
for (int i = 0; i < s3 - 2; i += 3)
{
long p = i + 0x36;
b[p] = (byte)(i/(10*h)); //blue
//b[p + 1] = 150; //green
b[p + 2] = (byte)(i/(10*h)); //red
}
//畫n個漸變色的圓:
for (int r = 0; r <300; r++)
{
for (double q = 0; q < 36.28; q += .01)
{
int x0 = 400; int y0 = 100;
int x = (int)(x0 + r * Math.Sin(q*.5));
int y = (int)(y0 - .2*r* Math.Cos(q*2));
long p =(long)(3 * (w * y + x) + 0x36);
if (p <= s3-2 && p >= 0) b[p] = (byte)(r *5); //blue
if (p <= s3-2 && p >= 0) b[p + 1] = (byte)(r*3); //green
if (p <= s3-2 && p >= 0) b[p + 2] = (byte)(255 - r); //red
}
}
//保存為二進制文件:
FileStream filesstream = new FileStream("image.bmp", FileMode.Create);
BinaryWriter objBinaryWriter = new BinaryWriter(filesstream);
foreach (byte index in b)
{
objBinaryWriter.Write(index);
}
objBinaryWriter.Close();
filesstream.Close();
//打開文件:
Process.Start("image.bmp");
//Console.ReadKey();
}
//轉十六進制位元組流:
static void putByte(long p, long v, byte[] b)
{
string hexString = Convert.ToString(v, 16);
if ((hexString.Length % 2) != 0)
hexString = "0" + hexString;
int gc = hexString.Length / 2;
for (int i = 0; i < gc; i++)
{
b[gc + p - i - 1] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
}
}
}
}

⑦ Java代碼如何反序列化PHP序列化數組後的字元串

public class ByteTest { public static void main(String[] args) { String str = "Hello world!"; // string轉byte byte[] bs = str.getBytes(); System.out.println(Arrays.toString(bs)); // byte轉string String str2 = new String(bs); System.out.println(str2); } }

⑧ php 如何將圖片轉換成java中Byte[]的

按照你的要求編寫的Java程序如下:( 要注意的地方見語句後面的注釋)


importjava.awt.image.BufferedImage;importjava.awt.image.RenderedImage;importjava.io.File;importjava.io.IOException;importjavax.imageio.ImageIO;publicclassImageWithArray{publicstaticvoidmain(String[]args){//讀取圖片到BufferedImageBufferedImagebf=readImage("c:\tmp\6\female.png");//這里寫你要讀取的絕對路徑+文件名//將圖片轉換為二維數組int[][]rgbArray1=convertImageToArray(bf);//輸出圖片到指定文件writeImageFromArray("c:\tmp\2.png","png",rgbArray1);//這里寫你要輸出的絕對路徑+文件名System.out.println("圖片輸出完畢!");}(StringimageFile){Filefile=newFile(imageFile);BufferedImagebf=null;try{bf=ImageIO.read(file);}catch(IOExceptione){e.printStackTrace();}returnbf;}publicstaticint[][]convertImageToArray(BufferedImagebf){//獲取圖片寬度和高度intwidth=bf.getWidth();intheight=bf.getHeight();//將圖片sRGB數據寫入一維數組int[]data=newint[width*height];bf.getRGB(0,0,width,height,data,0,width);//將一維數組轉換為為二維數組int[][]rgbArray=newint[height][width];for(inti=0;i<height;i++)for(intj=0;j<width;j++)rgbArray[i][j]=data[i*width+j];returnrgbArray;}(StringimageFile,Stringtype,int[][]rgbArray){//獲取數組寬度和高度intwidth=rgbArray[0].length;intheight=rgbArray.length;//將二維數組轉換為一維數組int[]data=newint[width*height];for(inti=0;i<height;i++)for(intj=0;j<width;j++)data[i*width+j]=rgbArray[i][j];//將數據寫入BufferedImageBufferedImagebf=newBufferedImage(width,height,BufferedImage.TYPE_INT_BGR);bf.setRGB(0,0,width,height,data,0,width);//輸出圖片try{Filefile=newFile(imageFile);ImageIO.write((RenderedImage)bf,type,file);}catch(IOExceptione){e.printStackTrace();}}}

運行結果:

圖片輸出完畢!

原圖:

熱點內容
福州職場解壓方式 發布:2025-02-05 06:36:31 瀏覽:556
c語言源程序的語句分隔符是 發布:2025-02-05 06:06:05 瀏覽:303
第一彈怎麼上傳視頻 發布:2025-02-05 06:06:04 瀏覽:996
策略樹演算法 發布:2025-02-05 06:00:31 瀏覽:610
存儲光碟數據恢復 發布:2025-02-05 05:43:50 瀏覽:384
android位置信息嗎 發布:2025-02-05 05:43:45 瀏覽:439
畫師怎麼配置電腦 發布:2025-02-05 05:38:56 瀏覽:969
c語言實驗心得與小結 發布:2025-02-05 05:38:54 瀏覽:807
越南搭建伺服器 發布:2025-02-05 05:34:03 瀏覽:980
php與oracle資料庫 發布:2025-02-05 05:34:01 瀏覽:470