📄 ber_int.c
字号:
/* * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Id: ber_int.c,v 1.22 2003/03/11 11:03:31 adam Exp $ */#if HAVE_CONFIG_H#include <config.h>#endif#include <string.h>#ifdef WIN32#include <winsock.h>#else#include <sys/types.h>#include <netinet/in.h>#endif#include "odr-priv.h"static int ber_encinteger(ODR o, int val);static int ber_decinteger(const unsigned char *buf, int *val, int max);int ber_integer(ODR o, int *val){ int res; switch (o->direction) { case ODR_DECODE: if ((res = ber_decinteger(o->bp, val, odr_max(o))) <= 0) { odr_seterror(o, OPROTO, 50); return 0; } o->bp += res; return 1; case ODR_ENCODE: if ((res = ber_encinteger(o, *val)) < 0) return 0; return 1; case ODR_PRINT: return 1; default: odr_seterror(o, OOTHER, 51); return 0; }}/* * Returns: number of bytes written or -1 for error (out of bounds). */int ber_encinteger(ODR o, int val){ int a, len; union { int i; unsigned char c[sizeof(int)]; } tmp; tmp.i = htonl(val); /* ensure that that we're big-endian */ for (a = 0; a < (int) sizeof(int) - 1; a++) /* skip superfluous octets */ if (!((tmp.c[a] == 0 && !(tmp.c[a+1] & 0X80)) || (tmp.c[a] == 0XFF && (tmp.c[a+1] & 0X80)))) break; len = sizeof(int) - a; if (ber_enclen(o, len, 1, 1) != 1) return -1; if (odr_write(o, (unsigned char*) tmp.c + a, len) < 0) return -1;#ifdef ODR_DEBUG fprintf(stderr, "[val=%d]", val);#endif return 0;}/* * Returns: Number of bytes read or 0 if no match, -1 if error. */int ber_decinteger(const unsigned char *buf, int *val, int max){ const unsigned char *b = buf; unsigned char fill; int res, len, remains; union { int i; unsigned char c[sizeof(int)]; } tmp; if ((res = ber_declen(b, &len, max)) < 0) return -1; if (len+res > max || len < 0) /* out of bounds or indefinite encoding */ return -1; if (len > (int) sizeof(int)) /* let's be reasonable, here */ return -1; b+= res; remains = sizeof(int) - len; memcpy(tmp.c + remains, b, len); if (*b & 0X80) fill = 0XFF; else fill = 0X00; memset(tmp.c, fill, remains); *val = ntohl(tmp.i); b += len;#ifdef ODR_DEBUG fprintf(stderr, "[val=%d]", *val);#endif return b - buf;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -