nettype.cpp

来自「一个语言识别引擎」· C++ 代码 · 共 140 行

CPP
140
字号
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-

/*
 * Copyright (C) 2006 Paul Fitzpatrick
 * CopyPolicy: Released under the terms of the GNU GPL v2.0.
 *
 */

#include <yarp/NetType.h>
#include <yarp/ManagedBytes.h>

using namespace yarp;

// slow implementation - only relevant for textmode operation

String NetType::readLine(InputStream& is, int terminal) {
    String buf("");
    bool done = false;
    while (!done) {
        //ACE_OS::printf("preget\n");
        int v = is.read();
        //ACE_OS::printf("got [%d]\n",v);
        char ch = (char)v;
        if (v!=0&&v!='\r'&&v!='\n') {
            buf += ch;
        }
        if (ch==terminal) {
            done = true;
        }
        if (ch<0) { 
            throw IOException("readLine failed");
        }
    }
    return buf;
}    

int NetType::readFull(InputStream& is, const Bytes& b) {
    int off = 0;
    int fullLen = b.length();
    int remLen = fullLen;
    int result = 1;
    while (result>0&&remLen>0) {
        result = is.read(b,off,remLen);
        //printf("read result is %d\n",result);
        if (result>0) {
            remLen -= result;
            off += result;
        }
    }
    return (result<=0)?-1:fullLen;
}

int NetType::readDiscard(InputStream& is, int len) {
    if (len<100) {
        char buf[100];
        Bytes b(buf,len);
        return readFull(is,b);
    } else {
        ManagedBytes b(len);
        return readFull(is,b.bytes());
    }
}


String NetType::toString(int x) {
    char buf[256];
    ACE_OS::sprintf(buf,"%d",x);
    return buf;
}

String NetType::toString(long x) {
    char buf[256];
    ACE_OS::sprintf(buf,"%ld",x);
    return buf;
}

String NetType::toString(unsigned int x) {
    char buf[256];
    ACE_OS::sprintf(buf,"%u",x);
    return buf;
}


int NetType::toInt(String x) {
    return ACE_OS::atoi(x.c_str());
}


/*
  PNG's nice and simple CRC code 
  (from http://www.w3.org/TR/PNG-CRCAppendix.html)
*/

/* Table of CRCs of all 8-bit messages. */
static unsigned long crc_table[256];

/* Flag: has the table been computed? Initially false. */
static int crc_table_computed = 0;
   
/* Make the table for a fast CRC. */
static void make_crc_table(void) {
    unsigned long c;
    int n, k;
   
    for (n = 0; n < 256; n++) {
        c = (unsigned long) n;
        for (k = 0; k < 8; k++) {
            if (c & 1)
                c = 0xedb88320L ^ (c >> 1);
            else
                c = c >> 1;
        }
        crc_table[n] = c;
    }
    crc_table_computed = 1;
}

/* Update a running CRC with the bytes buf[0..len-1]--the CRC
   should be initialized to all 1's, and the transmitted value
   is the 1's complement of the final running CRC (see the
   crc() routine below)). */

static unsigned long update_crc(unsigned long crc, unsigned char *buf,
                                int len) {
    unsigned long c = crc;
    int n;
  
    if (!crc_table_computed)
        make_crc_table();
    for (n = 0; n < len; n++) {
        c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
    }
    return c;
}

/* Return the CRC of the bytes buf[0..len-1]. */
unsigned long NetType::getCrc(char *buf, int len) {
    return update_crc(0xffffffffL, (unsigned char *)buf, len) ^ 0xffffffffL;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?