我正在尝试在我的C程序中将unsigned integer
写入缓冲区中的特定偏移量。缓冲区是典型的1字节char *
缓冲区。
我正在使用memcpy
通过一些指针算法将memcpy
目标指向具有该缓冲区的特定偏移量。
代码:
char* ph = (char*) malloc(4096);
//Init buffer with '\0'
memset(ph, '\0', 4096);
//Set int to be written
unsigned int tupleCnt = 4;
//Write to 4th byte offset (int* + 1)
memcpy(((int*) ph) + 1, (void *) &tupleCnt, sizeof(tupleCnt));
但是,这不会向此缓冲区写入任何内容。
这是写入此缓冲区的文件的hexdump:
0000000 0000 0000 0000 0000 0000 0000 0000 0000
^
如果我将其写入第0个偏移量,则可以正常工作:
//Write to 0th byte offset (int* + 0)
memcpy(((int*) ph) + 0, (void *) &tupleCnt, sizeof(tupleCnt));
这是hexdump:
0000000 0004 0000 0000 0000 0000 0000 0000 0000
^
顺便说一句,我正在使用fwrite
将此缓冲区写入文件,如果它有任何区别。
fwrite(ph, 1, strlen(ph), fp);
我也尝试在char *指针上使用逐字节递增,但它也没有帮助。 例如:
//Write to 4th byte offset (int* + 1)
memcpy(ph + 4, (void *) &tupleCnt, sizeof(tupleCnt));
提前致谢! 或者有没有其他方法可以将int(或任何数字)值写入char *缓冲区?除了int到字符串对话,我真的想避免。我认为这是太多的开销和天真的方法。 :)
答案 0 :(得分:1)
您问题不在 func loadData(){
timelineData.removeAllObjects()//(keepCapacity: false)
let findTimelineData:PFQuery = PFQuery(className:"Sweets")
findTimelineData.findObjectsInBackgroundWithBlock
{
(objects:[PFObject]? , error:NSError?) -> Void in
if error == nil
{
self.timelineData = objects! as? [PFObject]
//let array:NSArray = self.timelineData.reverseObjectEnumerator().allObjects
// self.timelineData = array as NSMutableArray
self.tableView.reloadData()
}
}
}
中,而在于您写入文件的方式:
memcpy
此代码写入0个字节,因为fwrite(ph, 1, strlen(ph), fp);
返回从开始到第一个strlen
的字节数,在您的情况下为零字节。
答案 1 :(得分:1)
strlen(ph)
会在看到空字符时停止计数。
由于您已将缓冲区归零,因此当您在第4个字节偏移量上写入时,strlen(ph)
将返回零,而在写入第一个字节偏移量时则不会。使用fwrite(ph, 1, 4096, fp);
同样要写整数,您可以使用此
int *ih = (int*)ph;
ih[1] = tuplecnt;