【问题标题】:How can I copy a selection from an unsigned char buffer into another variable and convert to int?如何将 unsigned char 缓冲区中的选择复制到另一个变量中并转换为 int?
【发布时间】:2013-08-10 11:17:06
【问题描述】:

我有一个 unsigned char 缓冲区,它正在被读取并且工作正常。 我需要能够在主缓冲区中选择一些位并将它们复制到另一个变量,以将十六进制数据(小端序)转换为要显示的整数。我这辈子都做不到这个工作。以下代码以十六进制打印我需要的值(由于字节序而以相反的顺序),但我不知道如何使用它。

void printFromBuffer(unsigned char *buffer, int block, int offset, int size){
    unsigned char *ptr = buffer;
    ptr += block * 0x10 + offset;
    for(int i=0;i<size;i++){
        printf("%X \n",ptr[i]);
    }
}

printFromBuffer(buffer, 0x08, 0x03, 0x02);

谢谢

【问题讨论】:

  • 缓冲区中的每个“块”是否为 16 字节宽(即这些是 128 位数字)?在我看来,如果转换函数只使用一个缓冲区和字节偏移量,并让 caller 负责执行块对齐(至少最初直到您更了解转换方面)。此外,如果您希望它反转字节以便获得真正的系统整数,则需要一个累加器。

标签: c++ buffer endianness


【解决方案1】:

好的,这段代码有效,但我怀疑这是最有效的方法。如果其他人可以清理它以防止将来效率低下,那么请继续。

void printFromBuffer(unsigned char *buffer, int block, int offset, int size, string attribute){
    unsigned char *ptr = buffer;
    char p[255];
    string contents = "";
    unsigned int x;   
    std::stringstream ss;
    ptr += block * 0x10 + offset;
    for(int i=size;i--;){
        sprintf_s(p,"%02X",ptr[i]);
        contents += p;
    }
    ss << std::hex << contents;
    ss >> x;
    cout << attribute << ": " << x;
    printf("\n");
}

printFromBuffer(buffer, 0x08, 0x03, 0x02, "Serial");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多