📄 ut.c
字号:
/**
* ut.c
* 僒僽儖乕僠儞廤
* Copyright (c)2002 Junichi Tomaru
*/
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "ut.h"
const char hexnum[] = "0123456789ABCDEF";
/**
* 悢抣傪侾俇恑暥帤楍偵(unsigned char)
*/
char *uctoahz( byte num, char *buf )
{
*( buf + 0 ) = hexnum[(num>>4)&0xf];
*( buf + 1 ) = hexnum[num&0xf];
*( buf + 2 ) = '\0';
return buf;
}
/**
* 悢抣傪侾侽恑暥帤楍偵(unsigned char)
*/
char *uctoaz( byte num, char *buf )
{
byte n;
char i, p, f;
for( n = 100, p = f = 0; n > 1; n /= 10 ){
i = num / n;
num %= n;
if(( f == 0 ) && ( i != 0 )){
f = 1;
}
if( f == 1 ){
*( buf + p ) = ( char )( i + 0x30 );
p++;
}
}
*( buf + p ) = num + 0x30;
*( buf + p + 1 ) = '\0';
return buf;
}
/**
* 悢抣傪侾侽恑暥帤楍偵(unsigned char,僛儘僒僾儗僗偟側偄)
*/
char *uctoa( byte num, char *buf )
{
byte n;
char i, p;
for( n = 100, p = 0; n > 1; n /= 10 ){
i = num / n;
num %= n;
*( buf + p ) = ( char )( i + 0x30 );
p++;
}
*( buf + p ) = num + 0x30;
*( buf + p + 1 ) = '\0';
return buf;
}
/**
* 悢抣傪侾俇恑暥帤楍偵(unsigned short)
*/
char *utoahz( word num, char *buf )
{
int i;
for( i = 0; i < 4; i++ ){
*( buf + i ) = hexnum[(num>>(4*(3-i)))&0xf];
}
*( buf + 4 ) = '\0';
return buf;
}
/**
* 悢抣傪侾俇恑暥帤楍偵(unsigned long)
*/
char *ultoahz( dword num, char *buf )
{
int i;
for( i = 0; i < 8; i++ ){
*( buf + i ) = hexnum[(num>>(4*(7-i)))&0xf];
}
*( buf + 8 ) = '\0';
return buf;
}
/**
* 悢帤傪傾僗僉乕暥帤楍偵(unsigned short)
*/
char *utoaz( word num, char *buf )
{
word n;
int i, p;
for( n = 10000U, p = 0; n > 1; n /= 10, p ++ ){
i = num / n;
num %= n;
*( buf + p ) = ( char )( i + 0x30 );
}
*( buf + p ) = num + 0x30;
*( buf + p + 1 ) = '\0';
return buf;
}
/**
* 悢帤傪傾僗僉乕暥帤楍偵(unsigned short,僛儘僒僾儗僗)
*/
char *utoa( word num, char *buf )
{
word n;
int i, p, f;
for( n = 10000U, p = f = 0; n > 1; n /= 10 ){
i = num / n;
num %= n;
if(( f == 0 ) && ( i != 0 )){
f = 1;
}
if( f == 1 ){
*( buf + p ) = ( char )( i + 0x30 );
p++;
}
}
*( buf + p ) = num + 0x30;
*( buf + p + 1 ) = '\0';
return buf;
}
/**
* 悢帤傪傾僗僉乕暥帤楍偵(signed short)
*/
char *itoaz( int num, char *buf )
{
int p;
p = 0;
if( num < 0 ){
num = _abs( num );
*buf = '-';
p ++;
}
utoaz(( word )num, buf + p );
return buf;
}
/**
* 悢帤傪傾僗僉乕暥帤楍偵(unsigned long)
*/
char *ultoaz( dword num, char *buf )
{
dword n;
int i, p;
for( n = 1000000000LU, p = 0; n > 1; n /= 10, p ++ ){
i = num / n;
num %= n;
*( buf + p ) = ( char )( i + 0x30 );
}
*( buf + p ) = num + 0x30;
*( buf + p + 1 ) = '\0';
return buf;
}
/**
* 悢帤傪傾僗僉乕暥帤楍偵(signed long)
*/
char *ltoaz( long num, char *buf )
{
int p;
p = 0;
if( num < 0L ){
num = _abs( num );
*buf = '-';
p ++;
}
ultoaz(( dword )num, buf + p );
return buf;
}
/**
* 僷僢僋僪俛俠俢傪傾儞僷僢僋僪俛俠俢偵
* l:僷僢僋僪俛俠俢攝楍偺寘悢
*/
char *pbcd2bcd( char *pbcd, char *bcd, int l )
{
int i;
for( i = 0; i < l; i ++ ){
*( bcd + i * 2 ) = ( *( pbcd + i ) >> 4 ) & 0xf;
*( bcd + i * 2 + 1 ) = *( pbcd + i ) & 0xf;
}
return bcd;
}
/**
* 傾儞僷僢僋僪俛俠俢傪僷僢僋僪俛俠俢偵
* l:傾儞僷僢僋僪俛俠俢攝楍偺寘悢
*/
char *bcd2pbcd( char *bcd, char *pbcd, int l )
{
int i, j;
for( i = 0; i < l; i ++ ){
j = i / 2;
if(( i % 2 ) == 0 ){
*( pbcd + j ) = ( *( bcd + i ) << 4 ) & 0xf0;
}
else{
*( pbcd + j ) |= *( bcd + i ) & 0xf;
}
}
return pbcd;
}
/**
* 傾儞僷僢僋僪俛俠俢傪暥帤楍偵
*/
char *bcd2str( char *bcd, char *str, int l )
{
int i;
for( i = 0; i < l; i ++ ){
*( str + i ) = *( bcd + i ) + 0x30;
}
*( str + l ) = '\0';
return str;
}
/**
* ip傾僪儗僗暥帤楍傪long宆偵曄姺偡傞
* input parameter
* adrstr "192.168.1.100"
* 暥帤楍偵悢帤偲僪僢僩埲奜娷傓偙偲偼偱偒側偄
* output parameter
* 曄姺屻偺傾僪儗僗
* "192.168.1.100" --> 0xc0a80164
* 僄儔乕偺応崌0x00000000傪曉偡
*/
dword ipstr2bin( char *adrstr )
{
char c, *p, ct, tmp[4];
int i;
dword ret, pa;
ret = 0;
p = adrstr;
ct = 0;
for( i = 0; i < 16; i++ ){
c = *( p + i );
tmp[ct] = c;
if( c == '.' ){
tmp[ct] = '\0';
pa = atol( tmp );
ret |= ( dword )( pa & 0xff );
ret <<= 8;
ct = 0;
}
else if( c == '\0' ){
tmp[ct] = '\0';
pa = atol( tmp );
ret |= ( dword )( pa & 0xff );
break;
}
else if( isdigit( c ) == 0 ){
ret = 0;
break;
}
else{
ct++;
}
}
return ret;
}
/**
* 俬俹傾僪儗僗傪暥帤楍偵偡傞
*/
char *long2ipstr( dword ipadr, char *buf )
{
ul_t tmp;
char *p;
tmp.data = ipadr;
uctoaz( tmp.bytes.hh, buf );
strcat( buf, "." );
p = strrchr( buf, '.' );
uctoaz( tmp.bytes.hl, p + 1 );
strcat( buf, "." );
p = strrchr( buf, '.' );
uctoaz( tmp.bytes.lh, p + 1 );
strcat( buf, "." );
p = strrchr( buf, '.' );
uctoaz( tmp.bytes.ll, p + 1 );
return buf;
}
/**
* 巜掕僶僀僩暘偺斾妑
*/
bool bytecomp( const byte *src, const byte *dest, unsigned int size )
{
int i;
for( i = 0; i < size; i++ ){
if( src[i] != dest[i] ){
return TRUE;
}
}
return FALSE;
}
/**
* 巜掕悢暘僨乕僞傪僐僺乕偡傞
*/
void packet_copy( char *dst, const char *src, unsigned int size )
{
unsigned int i;
for( i = 0; i < size; i++ ){
dst[i] = src[i];
}
}
/**
* 巜掕応強偵巜掕暘偩偗僨乕僞傪奿擺偡傞
*/
void packet_set( char *dst, byte val, unsigned int count )
{
unsigned int i;
for( i = 0; i < count; i++ ){
*( dst + i ) = val;
}
}
/**
* 僶僢僼傽偐傜係僶僀僩庢傝弌偡
*/
dword getlongvalue( byte *buf, int offset )
{
ul_t ret;
ret.bytes.hh = *( buf + offset );
offset++;
ret.bytes.hl = *( buf + offset );
offset++;
ret.bytes.lh = *( buf + offset );
offset++;
ret.bytes.ll = *( buf + offset );
return ret.data;
}
/**
* 僶僢僼傽偐傜俁僶僀僩庢傝弌偡
*/
dword getthreevalue( byte *buf, int offset )
{
ul_t ret;
ret.bytes.hh = 0;
ret.bytes.hl = *( buf + offset );
offset++;
ret.bytes.lh = *( buf + offset );
offset++;
ret.bytes.ll = *( buf + offset );
return ret.data;
}
/**
* 僶僢僼傽偐傜俀僶僀僩庢傝弌偡
*/
word getwordvalue( byte *buf, unsigned int offset )
{
ui_t ret;
ret.bytes.hi = *( buf + offset );
offset++;
ret.bytes.lo = *( buf + offset );
return ret.data;
}
/**
* 僶僢僼傽偵係僶僀僩偺僨乕僞傪彂偔
*/
void setlongvalue( byte *buf, int offset, dword val )
{
ul_t tmp;
byte *p;
tmp.data = val;
p = buf + offset;
*p = tmp.bytes.hh;
p++;
*p = tmp.bytes.hl;
p++;
*p = tmp.bytes.lh;
p++;
*p = tmp.bytes.ll;
}
/**
* 僶僢僼傽偵俁僶僀僩偺僨乕僞傪彂偔
*/
void setthreevalue( byte *buf, int offset, dword val )
{
ul_t tmp;
byte *p;
tmp.data = val;
p = buf + offset;
*p = tmp.bytes.hl;
p++;
*p = tmp.bytes.lh;
p++;
*p = tmp.bytes.ll;
}
/**
* 僶僢僼傽偵俀僶僀僩偺僨乕僞傪彂偔
*/
void setwordvalue( byte *buf, int offset, word val )
{
ui_t tmp;
byte *p;
tmp.data = val;
p = buf + offset;
*p = tmp.bytes.hi;
p++;
*p = tmp.bytes.lo;
}
/**
* 僨乕僞傪俀僶僀僩偢偮壛嶼偡傞丅
* 僠僃僢僋僒儉偺寁嶼帪側偳偵梡偄傞丅
*/
dword data_add( byte *addr, unsigned int size, dword init )
{
word i;
dword ret;
for( i = 0, ret = init; size > 1; addr += 2, size -= 2 ){ /* 俀僶僀僩偢偮壛嶼 */
ret += (( dword )( *addr ) << 8 ) + *( addr + 1 );
if( ret >= 0x10000 ){ /* 僆乕僶乕偟偨傜 */
ret &= 0xffff;
ret++; /* 僉儍儕暘傪懌偡 */
}
}
if( size == 1 ){ /* 婏悢僶僀僩偺偲偒 */
ret += (( dword )( *addr ) << 8 ); /* 侾僶僀僩暘偩偗懌偡 */
if( ret >= 0x10000 ){ /* 僆乕僶乕偟偨傜 */
ret &= 0xffff;
ret++; /* 僉儍儕暘傪懌偡 */
}
}
return ret;
}
/**
* 侾偺曗悢偵傛傞僠僃僢僋僒儉寁嶼儖乕僠儞(=俀偺曗悢偺壛嶼亄僉儍儕)
* addr: 奐巒傾僪儗僗
* size: 挿偝(僶僀僩扨埵)
* init: 壛嶼弶婜抣(媅帡僿僢僟晹暘偩偗寁嶼偟偨傕偺傪擖傟傞丅懠偺偲偒偼侽傪擖傟傞丅)
* flg: 僼儔僌(CHECK:僠僃僢僋僒儉専徹帪 MAKE:僠僃僢僋僒儉嶌惉帪)
* return: 寁嶼寢壥
*/
unsigned int checksum( byte *addr, unsigned int size, dword init, char flg )
{
word sum;
dword tmp;
tmp = data_add( addr, size, init ); /* 僨乕僞偺壛嶼 */
sum = ( ~tmp ) & 0xffff; /* 斀揮 */
if(( flg == SUM_MAKE ) && ( sum == 0 )){ /* 寁嶼寢壥偑侽偺偲偒偼俥俥俥俥偵偡傞 */
sum = 0xffff;
}
return sum;
}
/**
* 俫俿俿俹暥帤楍撪偺俠俧俬晹暘偵摿掕偺暥帤楍偑娷傑傟偰偄傞偐挷傋傞丅
* 偙偺専嶕偺桳岠斖埻偼"HTTP/"傑偱偱偁傞丅
* input
* buffer : 暥帤楍乮俫俿俵俴暥帤楍乯
* cmp : 暥帤楍乮専嶕偡傞暥帤楍乯
* output
* 1 : 娷傑傟偰偄傞
* 0 : 娷傑傟偰偄側偄
*/
char searchvalue( char *buffer, char *cmp )
{
char c1, c2, *p;
int i, j, k;
p = strstr( buffer, "HTTP/" );
*p = '\0';
j = strlen( buffer );
k = strlen( cmp );
if( k > j ){
return 0;
}
for( i = k = 0; i < j; i++ ){
c1 = *( buffer + i );
c2 = *( cmp + k );
if( c1 == c2 ){
if( *( cmp + k + 1 ) == '\0' ){
return 1;
}
else{
k++;
}
}
else{
k = 0;
}
}
return 0;
}
/* end of ut.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -