2007年10月26日 星期五

NetBIOS over TCP/IP 名稱解析 IP 位址方法

NetBIOS over TCP/IP 名稱解析 IP 位址方法
1.在LMHOSTS檔案中尋找。
2.區域網路中廣播。
3.透過WINS伺服器。

MS Windows系統使用下列四種方法解析:
B Mode(Broadcast、ox1)
不適合大型網路,查詢順序如下
1.LMHOSTS CACHE
2.Broadcast
3.LMHOSTS

P Mode(per-to-per、0x2)
僅使用WINS伺服器查詢。

M Mode(mixed、0x4)
聯合使用B Mode及P Mode,預設使用B Mode,如果不能使用Broadcast,則使用P Mode的WINS伺服器。

H Mode(hybrid、0x8)
聯合使用B Mode及P Mode,預設使用P Mode。

2007年10月23日 星期二

計算中文 big5 在編碼中的順序

//計算中文 big5 在編碼中的順序
//高位元區段 81-8D 8E-A0 A1-FE ---->126個
//低位元區段 40-7E A1-FE ---> 157 個
//先計算高位元的距離 公式:(高位元 - 0x81) * 157
//再計算低位元距離 分為兩組 40-7E A1-FE
//0x40=64 0x7E=126 63個
//0xA1=161 0xFE=254 94個
//落在 0x40-0x7E 直接加上 (低位元的值 - 0x40 + 1)
//落在 0xA1-0xFE 63 + (低位元的值 - 0xA1 + 1)

// PHP

<?php
function big5order($big5){
$big5_h = $big5[0] . $big5[1];
$big5_l = $big5[2] . $big5[3];int big5order(unsigned short big5){
unsigned short big5order;
unsigned char hi, lo;

hi = (big5 & 0xFF00) >> 0x08;
lo = big5 &0x00FF;

big5order = (hi - 0x81) * 157;

if(lo>=0x40 && lo<=0x7E)
big5order = big5order + lo - 0x40 + 1;
else if(lo>=0xA1 && lo<=0xFE)
big5order = big5order + 63 + lo - 0xA1 + 1;

return big5order;
}

?>

// C/C++

int big5order(unsigned short big5){
unsigned short big5order;
unsigned char hi, lo;

hi = (big5 & 0xFF00) >> 0x08;
if(!(hi>=0x81 && hi<=0xFE)) return -1;

lo = big5 &0x00FF;
if(!((lo>=0x40 && lo<=0x7E) (lo>=0xA1 && lo<=0xFE))) return -2;

big5order = (hi - 0x81) * 157;

if(lo>=0x40 && lo<=0x7E)
big5order = big5order + lo - 0x40 + 1;
else if(lo>=0xA1 && lo<=0xFE)
big5order = big5order + 63 + lo - 0xA1 + 1;

return big5order;
}

2007年10月18日 星期四

將字串型態表示的16位元數字轉為整數資料型態

將字串型態表示的16位元數字轉為整數資料型態

傳入的參數可為 " ffbc","FFbC","0xFFFC", "12F4"


//字元 HEX 轉 OCT
int chex2oct(char ch[]){
unsigned int i, j[10], leng, leng_s=0, chex=0;
unsigned int hex16[] = {1, 16, 256, 4096, 65536, 1048576, 16777216,268435456};
leng = strlen(ch);

for(i=0; i<leng; i++) {
if(ch[i]>47 && ch[i]<58) j[leng_s++] = ch[i] - 48;
else {
switch (ch[i]){
case 'a': case 'A': j[leng_s++] = 10; break;
case 'b': case 'B': j[leng_s++] = 11; break;
case 'c': case 'C': j[leng_s++] = 12; break;
case 'd': case 'D': j[leng_s++] = 13; break;
case 'e': case 'E': j[leng_s++] = 14; break;
case 'f': case 'F': j[leng_s++] = 15; break;
}
}
}

for(i=0; i<leng_s; i++) chex += j[i] * hex16[leng_s - i - 1];
return chex;
}