2012-10-08 228 views
0

有关任务的基本信息:如何从一个字节数组中获取数据

我需要写上C语言这需要一个字节数组功能(它reperesents包)解析它,做一些东西并返回一个已更改的字节数组。

我的方法:

"filename.h" 
    char* ParsePackage(const char* byteArray); 
typedef struct 
{ 
    char name[4]; 
    float value; 
} packageStructure; 

我用它的ByteArray浇铸的结构packageStructure,那么我想通过访问结构的字段,以获取数据: “filename.cpp”

include "filename.cpp" 
char* ParsePackage(const char* byteArray) 
{ 
    packageStructure* tmp = (packageStructure*) byteArray; 
    // get values of structure fields and do some staff with them: 
    tmp->name; 
    tmp->value; 
    return (char*)modifiedByteArray; 
} 

不满意结果,因为从字节数组的全部数据被写入到结构,这是出了名的第一个领域,第二个字段有一些随机值;

所以在这里预期的问题是:,我做错了(如何改变我的方法,使其工作)?你能提供解析字节数组的其他方法吗?

在此先感谢!

+0

“字节数组”是如何创建和填充的? –

+0

int main(void) { ParsePackage(“tex123”); return 0; } –

回答

0

在我的实验,我发现,有可能投一个字节数组一个struct。这允许以更优雅(我自己的意见)方式解决反序列化任务。

我的第一次尝试失败,因为我测试了错误的输入,这是一个字符串文字。 这里是工作示例:

".h" 
typedef struct Test 
    { 
     char name[2] ; 
     float number; 
    } Test; 

".c" 
char* TestStruct(char* byteArray) 
{ 
    Test str; 

    str = *(Test*)byteArray; 
    return byteArray; 
} 
"main.c" 
int main(void) 
{ 
    Test str; 
    strcpy(str.name,"asd\0"); 
    str.number = 0.25; 
    TestStruct((char*)&str); 
    return 0; 
} 
3

我猜"tex"应该是这个名字,而123应该是这个值。但是,正如你所看到的那样,这种方式不行,尤其是浮点值。您只能通过转换将字符串中的数字转换为浮点值。

相反,你必须提取从字符串的前三个字符并投入name,那么你必须提取接下来的三个字符和字符串例如使用strtof将字符串转换为浮点数。

当再次创建一个字符串,你可以使用snprintf了点。

你必须做这样的事情:

char* ParsePackage(char* byteArray) 
{ 
    packageStructure tmp; 

    /* Extract values from string, first the name */ 
    memcpy(tmp.name, byteArray, sizeof(tmp.name) - 1); 
    tmp.name[sizeof(tmp.name) - 1] = '\0'; /* Make sure it's terminated */ 

    /* Then the value */ 
    tmp.value = strtof(&byteArray[3], NULL); 

    /* Now do whatever you need to do with the structure... */ 

    /* Convert back to a string */ 
    /* For that we need a string */ 
    static char output[16]; 

    /* Then put the data from the structure into the string */ 
    snprintf(output, sizeof(output), "%s%3.0f", tmp.name, tmp.value); 

    /* Return the string */ 
    return output; 
} 

然而,不是做这个工作,你自己,你应该找到一个serialization库,这将处理所有的血淋淋的细节为您服务。

+0

“tex123”是一个字符串字面值right ??? ...按@ spin_eight的函数调用。 – Jeyaram

+0

@rjayavrp char * ParsePackage(const char * byteArray); –

+0

@Joachim Pileborg。我是正确的,使用序列化我需要包括其他库(如boost),而不是在C标准库中提供。我只能通过C标准库来解决我的任务。另外我正在寻找一种方法,我可以从数据流中获取所有需要的值并将其转换为结构,我想知道是否有可能,如果不是,我需要了解原因。 –

0
int main(void) { ParsePackage("tex123"); return 0; } 

根据代码,您的文本"tex123"是只读的。

.LFE0: 
     .size ParsePackage, .-ParsePackage 
     .section  .rodata 
.LC0: 
     .string "tex123" 
     .text 
     .globl main 
     .type main, @function 
main: 
.LFB1: 
     .cfi_startproc 
     pushq %rbp 
     .cfi_def_cfa_offset 16 
     .cfi_offset 6, 
     .... 
     .... 

所以试图改变​​是一个坏主意。

+0

好的,谢谢你指出。你能给我一些关于将字节数组转换为struct的信息,我可以通过这样做来解决我的任务吗? –

1

我不知道你想要什么做什么,但似乎你想要使用的名称作为字符串和值当输入一个字符串的浮动。

我会做这样的事情:

packageStructure ParsePackage(char* byteArray) 
{ 
    char *modifiedByteArray = malloc(100); 
    packageStructure tmp; 
    strncpy(tmp.name, byteArray, 3); 
    tmp.name[3] = 0; 
    tmp.value = atof(byteArray+4); 
    return tmp; 
} 
+0

输入是从服务器获得的字节数组,该数组(包)以特定格式形成以解析数组我试图使用struct。我知道如何解析它,但实际上我很感兴趣,如果有可能从该数组中获取值,可以使用cast来构造 –

+1

@spin_eight,是的,你可以,但是在内存中'float'的表示不是简单的“123”,你可以阅读:en.wikipedia.org/wiki/IEEE_floating_point – Marcus

+0

马库斯,感谢链接 –

相关问题