【发布时间】:2016-02-21 08:06:53
【问题描述】:
我正在尝试构建一个简单的函数来处理“假”磁盘上的块条带化(在内存中实现为由 4 字节整数表示的 n 个 x 字节块的嵌套数组,在关闭时存储到常规文件中)。数据从我的打开文件表 (OFT) 的缓冲区中作为字符数组传递到我的 write_block 函数中。
为了做到这一点,我的想法是使用以下函数将我的字符数组转换为 4 个字符块中的整数值(4x1 字节字符的逻辑相当于 1x4 字节整数):
//write_block(index, block_pointer)
// write block, start with array of characters and write integers to ldisk (convBlock == converted Block)
// return: 1 if successful, -1 if not
int write_block(int blockIndex, char *convBlock) {
if (strlen(convBlock) > blockSize) {
printf("Block passed to write exceeds max block size\n");
return -1;
}
int i, j;
int scalar, currIndex;
for (i = 0; i < strlen(convBlock) / sizeof(int) + ((strlen(convBlock) % sizeof(int) == 0) ? 0 : 1); i++) {
scalar = 1;
for (j = 0; j < sizeof(int); j++) {
currIndex = (i * sizeof(int) + j);
if (currIndex > strlen(convBlock))
break;
ldisk[blockIndex][i] += convBlock[i] * scalar;
scalar *= 1000;
}
}
return 1;
}
但是,这不起作用,因为无符号 4 位整数的最大大小为 4294967295(10 位),而以这种方式转换 char 数组会产生 12 位(每个字符 3 个)。我知道从技术上讲我应该能够做到这一点,因为 char 占用一个字节,而整数占用 4。
我的下一个想法是转换为二进制,然后再转换回整数。但是,我需要以某种方式背靠背存储 4 个字符的二进制表示,这需要一个 4*8 = 32 位的整数,而最大数字类型 (long long) 的最大大小是 18446744073709551615 (20位数)。
【问题讨论】:
-
@Rabbid76 那么要转换回来,你会分出 256 的倍数吗?
-
恐怕你的问题不清楚。你想用这些数据块做什么?
-
@chqrlie 我试图将它们放在一个名为 ldisk 的数组中,该数组由
int ldisk[numBlocks][blockSize/sizeof(int)]初始化 -
好的,但是为什么你的虚拟磁盘是由 4 个字节的
int元素而不是字节组成的呢?为什么你甚至认为int是4 个字节,你为什么要使用签名int?您如何将数据切成块...您的规范丢失了。 -
你能把任意长的字符串传给write_block吗?