WSPutRawData (C 函数)

int WSPutRawData(WSLINK link, const unsigned char *d, int l)

从长度为 l 字节的 dlink 写入原始字符数据或数字数据.

更多信息

  • WSPutRawData()WSPutType()WSPutRawSize() 一起使用可以手工将数据写入某链接,而不是像 WSPutInteger32()WSPutUTF8String() 一样使用指定类型的 API 函数.
  • WSPutRawData() 发送数字数据绕过了 WSTP 库关于确保异构计算机系统间数据兼容的内部机制. 若要使用这个函数,用户需要考虑到不同计算机系统之间的字节序和 C 类型的大小区别.
  • 当发送字符数据时,要使用 WSPutType() 和令牌参数 WSTKOLDSTR (用于字符串数据)或 WSTKOLDSYM(用于符号数据). 不要以除了7位 ASCII 编码以外的格式使用 WSPutRawData() 发送字符数据.
  • 当发送数字数据时,要使用 WSPutType() 和正确的二进制数据令牌. WSTP 的标头文件 wstp.h 包含这些令牌的完整列表,不过以下仍然列出最常使用的令牌,以供查询方便:
  • unsigned charWSTK_CUCHAR
    shortWSTK_CSHORT
    intWSTK_CINT
    longWSTK_CLONG
    floatWSTK_CFLOAT
    doubleWSTK_CDOUBLE
    long doubleWSTK_CLONGDOUBLE
  • 若发生错误,则 WSPutRawData() 返回0;若函数成功,则返回非零值.
  • WSPutRawData() 失败,则使用 WSError() 检索错误代码.
  • WSTP 的标头文件 wstp.h. 已对 WSPutRawData() 作出声明.

范例

基本范例  (1)

#include "wstp.h"

/* send a function as raw data to a link */

void f(WSLINK lp)
{
    int a = 2, b = 3;

    if(! WSPutType(lp, WSTKFUNC))
        { return; /* unable to put the function type to lp */ }

    if(! WSPutArgCount(lp, 2))
        { return; /* unable to put the number of arguments to lp */ }

    if(! WSPutType(lp, WSTKOLDSYM))
        { return; /* unable to put function head type to lp */ }
    
    if(! WSPutRawSize(lp, 4))
        { return; /* unable to put the size of the symbol to lp */ }

    if(! WSPutRawData(lp, (const unsigned char *)"Plus", 4))
        { return; /* unable to put the raw bytes to lp */ }

    if(! WSPutType(lp, WSTK_CINT))
        { return; /* unable to put the argument type to lp */ }

    if(! WSPutRawSize(lp, sizeof(int)))
        { return; /* unable to put the size of the integer to lp */ }

    if(! WSPutRawData(lp, (const unsigned char *)&a, sizeof(a)))
        { return; /* unable to put the raw bytes of a to lp */ }

    if(! WSPutType(lp, WSTK_CINT))
        { return; /* unable to put the second argument type to lp */ }

    if(! WSPutRawSize(lp, sizeof(int)))
        { return; /* unable to put the size of the integer to lp */ }

    if(! WSPutRawData(lp, (const unsigned char *)&b, sizeof(b)))
        { return; /* unable to put the raw bytes of b to lp */ }
}