To iihero, 你是想用二进制直接memcpy的方式,那就直接将0x16进制的转换成可打印的字符形式, 但是好像不如格式化输入输出来得简单。这个问题是:如何在mysql中存储二进制数据?而且需要是通用的的方法,所以用格式化输入只是针对上面举的例子,可能会比较简单,但并不通用(除非为每一个二进制数据存储写格式化接口?这不现实)。把二进制的数据通过0x16禁止的转换是可行的方法,不过存储空间将会是原来的2倍,我刚才试验了一下,对BYTE来说从0-255中,只有0和39(符号为:‘)是需要转义的,其他的都可以不用变,因此专门针对这2个字符进行处理,这样所需要的存储空间,只比原来的数据多出25%左右。
需要程序里头,把这个结构体,转到unsigned char[4 + 32 + sizeof(long)], 之后bind到那个blob里头.
多谢回复!“转到unsigned char[4 + 32 + sizeof(long)], "这个是定长的数组,确定是这样吗?
另外,我刚才想到一个方法,把一个c++的struct转成字符串,帮我看看是否可行?
struct不能作为string存储的原因是因为里面有0表示为字符串的结束符,如果通过某种转义将这些0换成其他的字符,是不是就能存储了?
你想弄成字符串格式,那也非常简单,
char res[256];
sprintf(res, "%d;%s\n%ld", a.val, a.name, a.data);
取回来的时候,
直接
scanf就行了。
关键是格式串中的;以及\n能把它们区分开来。
这里假定a.name不会出现换行符\n(显然不会:))
C++有明确的对齐方式,
unsigned char[4 + 32 + sizeof(long)]
应该是定长的。
取决于是32位,还是64位,32位里头, sizeof(long)为4字节,否则为8字节。
你是想用二进制直接memcpy的方式,那就直接将0x16进制的转换成可打印的字符形式, 但是好像不如格式化输入输出来得简单。这个问题是:如何在mysql中存储二进制数据?而且需要是通用的的方法,所以用格式化输入只是针对上面举的例子,可能会比较简单,但并不通用(除非为每一个二进制数据存储写格式化接口?这不现实)。把二进制的数据通过0x16禁止的转换是可行的方法,不过存储空间将会是原来的2倍,我刚才试验了一下,对BYTE来说从0-255中,只有0和39(符号为:‘)是需要转义的,其他的都可以不用变,因此专门针对这2个字符进行处理,这样所需要的存储空间,只比原来的数据多出25%左右。
memcpy到一个buffer, 然后调用mysql的api, 直接bind,这个不难。
根本不需要你转换。
读出的时候,直接bind到buffer, 然后强制转换。
这是通用的做法。