首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用memcpy从缓冲区中删除特定字节

无法使用memcpy从缓冲区中删除特定字节
EN

Stack Overflow用户
提问于 2017-05-30 08:29:33
回答 3查看 329关注 0票数 0

我无法从我想要的大小截断缓冲区。我有点困惑为什么我会得到错误的结果?尽管我对memcpy()的用法是正确的。我也读了手册页。我在这里做错事了?

我想要达到的目标:

代码语言:javascript
复制
Buff: 00 83 00 00 16 0a 44 00 00 00 00 bd 0e 8a 0c 61 01 13 51 24 ad 9a 0b 1c 0e ff ff 00

复制从bd开始的字节,这意味着12字节直到结束-

想要的输出应该是:

bd 0e 8a 0c 61 01 13 51 24 ad 9a 0b 1c 0e ff ff 00

,这是我的代码:,我正在接收来自串行设备的响应,我需要切一些字节。

代码语言:javascript
复制
void rx_dev(transport, int addr, const void *buf, unsigned count) {
    uint8_t s[1024];
    uint8_t *p;

    memset (s, 0, sizeof(s));
    // This below function does only the hex parsing.
    hex_parse(s, sizeof(s), buf, count);
    printf("* %02x %s\n", addr, s);

    printf("Count: %zu\n", count);
    p = s;

    printf("p* %s\n", p);

    // I'm doing this check to avoid something greater than 14.
    if (count > 14) {
        memcpy(p, s+11, count-11);
        printf("*Trim:%s\n", p);
    }
}

编辑:添加了更多细节

代码语言:javascript
复制
int hex_parse(char *out, unsigned size, const void *buf, unsigned count)
{
    const uint8_t *p = buf;
    unsigned i;
    int n = 0;

    if (count)
    {
        if (n + 2 < size)
        {
            out[n+0] = hexchars[(p[0] >> 4) & 15];
            out[n+1] = hexchars[p[0] & 15];
        }
        n += 2;
    }

    for (i = 1; i < count; i++) {
        if (n + 3 < size)
        {
            out[n+0] = ' ';
            out[n+1] = hexchars[(p[i] >> 4) & 15];
            out[n+2] = hexchars[p[i] & 15];
        }
        n += 3;
    }

    if (n < size)
        out[n] = '\0';
    else if (size)
        out[size-1] = '\0';

    return n;
}

My ouutput:

代码语言:javascript
复制
* 01 00 83 00 00 16 0a 44 00 00 00 00 bd 0e 8a 0c 61 01 13 51 24 ad 9a 0b 1c 0e ff ff 00

p* 00 83 00 00 16 0a 44 00 00 00 00 bd 0e 8a 0c 61 01 13 51 24 ad 9a 0b 1c 0e ff ff 00

这里我没有得到正确的输出,为什么它要打印28字节,这不是我想要的结果?

代码语言:javascript
复制
Trim: 16 0a 44 00 00 0 44 00 00 00 00 bd 0e 8a 0c 61 01 13 51 24 ad 9a 0b 1c 0e ff ff 00
EN

回答 3

Stack Overflow用户

发布于 2017-05-30 08:35:58

您可以使用memmove,就像在memcpy中,目标和源不能相互重叠,而在memmove中,这并不重要。所以你可以

代码语言:javascript
复制
 int offset = 11,size = 28;
 memmove(buf, buf+off, size - off);
票数 2
EN

Stack Overflow用户

发布于 2017-05-30 08:36:21

memcpy调用中的源和目的地重叠。从标准:

如果复制发生在重叠的对象之间,则行为是未定义的。

标准函数memmovememcpy类似,但为重叠对象定义,请使用该函数。

票数 2
EN

Stack Overflow用户

发布于 2017-05-30 08:33:39

当您调用memcpy时,您不会从缓冲区复制字节。您正在复制"hex_parsed“字符串。由于这种格式每字节使用3个字符(2位数和一个空格),所以剪切11个字符大约是4个字节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44257224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档