我正在尝试构建一个简单的函数来处理块假脱机到"假的" disk(在内存中实现为由4个字节的int表示的n个x字节块的嵌套数组,在关闭时存储到常规文件中)。数据作为来自我的打开文件表(OFT)中缓冲区的字符数组传递到我的CustomerName
函数中。
为了做到这一点,我的思考过程是通过使用以下函数将我的chars数组转换为4个字符块的整数值(逻辑为4x1字节字符相当于1x4字节整数):
write_block
然而,这不起作用,因为无符号4位整数的最大大小为//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;
}
(10位),而以这种方式转换4294967295
数组会产生12位数(3位数)每个字符)。我知道我应该在技术上能够这样做,因为char占用一个字节,而整数需要4。
我的下一个想法是转换为二进制然后转换回整数。但是,我需要以某种方式将4个字符的二进制表示形式背靠背存储,这需要一个4 * 8 = 32位的整数,而最大数字类型(char
)的最大大小为{{1 (20位)。
答案 0 :(得分:1)
我对您的目标的理解是您希望将一个空终止的字符块存储到由整数构成的块虚拟磁盘blockIndex
中。
以下是函数的简化版本,可以处理不同的存储类型:4字节整数或8字节整数:
#include <stdint.h>
//write_block(index, block_pointer)
// write block, start with array of characters src and write integers to ldisk
// return: 1 if successful, -1 if not
int write_block(int blockIndex, const char *src) {
size_t i, j, k, size;
size = strlen(src) + 1; // include the null terminator in the written conversion.
if (size > blockSize) {
printf("Block passed to write exceeds current block size\n");
return -1;
}
for (i = j = k = 0; i < size; i++) {
ldisk[blockIndex][j] &= ~(0xFFULL << k);
ldisk[blockIndex][j] |= (unsigned long long)(unsigned char)src[i] << k;
k += 8;
if (k == sizeof(ldisk[blockIndex][j]) * 8) {
j++;
k = 0;
}
}
return 1;
}
注意:
char
值转换为unsigned char
,以避免签名char
类型时签名传播,这是许多系统的默认设置。j
)写入调用者,则应返回该数字。这是有用的信息,可以很容易地从-1中区分出错误。char
有8位。如果你真的寻求与异国平台完全兼容,那么使用CHAR_BITS
代替8
将允许其他值进行其他一些不断的调整。unsigned long long
算术来允许存储单元尽可能大。