如何在CAPL中将十六进制字符串转换为字节数组?

时间:2018-11-15 17:49:22

标签: type-conversion capl canoe

例如考虑使用这种类型的十六进制字符串:

    func (c ChromosomeIndexer) AddDocuments(db *sql.DB, client *elastic.Client, coordID int) {
    sqlQuery := fmt.Sprintf("SELECT seq_region.name, seq_region.length FROM seq_region WHERE seq_region.`name` REGEXP '^[[:digit:]]{1,2}$|^[xXyY]$|(?i)^mt$' AND seq_region.`coord_system_id` = %d", coordID)
    stmtOut, err := db.Prepare(sqlQuery)
    check(err)
    defer stmtOut.Close()
    stmtOut.Query()
    rows, err := stmtOut.Query()
    defer rows.Close()
    check(err)

    chromoFn := func(rows *sql.Rows, bulkRequest *elastic.BulkService) {
        var name string
        var length int
        err = rows.Scan(&name, &length)
        check(err)
        chromo := Chromosome{ID: name, Length: length}
        fmt.Printf("chromoID: %s\n", chromo.ID)
        req := elastic.NewBulkIndexRequest().
            OpType("index").
            Index("chromosomes").
            Type("chromosome").
            Id(chromo.ID).
            Doc(chromo)
        bulkRequest.Add(req)
    }
    elasticutil.IterateSQL(rows, client, chromoFn)

}

如何从字符串中提取CAPL中的字节数组表示形式,例如:

chromosomes

编辑:仅允许使用Vector CANoe支持的数据类型/功能!

3 个答案:

答案 0 :(得分:1)

使用strtok将字符数组拆分为单独的十六进制字符串,然后使用long strtol( const char *restrict str, char **restrict str_end, int base )将每个十六进制字符串转换为整数值。

答案 1 :(得分:0)

我们可以使用sscanf()将数字转换为unsigned char。循环中,我们还需要使用%n转换来确定下一次迭代的读取位置。

这是一个简单的示例(在现实生活中,您需要进行一些范围检查以确保不会溢出输出缓冲区):

#include <stdio.h>

int main(void)
{
    const char hex_str[100] = "0x01, 0x03, 0x04, 0x0A";
    unsigned char bytes[4];

    {
        int position;
        unsigned char *b = bytes;

        for (const char *input = hex_str;  sscanf(input, "%hhi, %n", b, &position) == 1;  ++b) {
            input += position;
        }
    }

    /* prove we did it */
    for (size_t i = 0;  i < sizeof bytes;  ++i) {
        printf("%hhu ", bytes[i]);
    }
    puts("");
}

答案 2 :(得分:0)

感谢所有... 其实我自己也找到了解决方案:

True
True
True
True

现在这是一个简单的转换: char hex_str[100] = "0x01 0x03 0x04 0x0A"; long data[4]; dword pos = 0; pos = strtol(hex_str, pos, data[0]); pos = strtol(hex_str, pos, data[1]); pos = strtol(hex_str, pos, data[2]); pos = strtol(hex_str, pos, data[3]); write("0x%02x,0x%02x,0x%02x, 0x%02x", data[0], data[1], data[2], data[3]);

相关问题