我尝试将字符串存储为整数,如下所示:
我读了字符串的字符,每4个字符我这样做:
val = (int) ch << 24 | (int) ch << 16 | (int) ch << 8 | (int) ch;
然后我将整数值放在一个称为内存(=> int memory[16]
)的整数数组中。
我想以自动的方式为字符串的每个长度执行此操作,而且我很难为任意大小的字符串再次反转该过程。有什么帮助吗?
编辑:
(从下面)
基本上,我在JAVA练习。这是一个MIPS模拟器系统。我有注册,基准,指令,标签,控制,APSImulator类和其他。当我尝试将程序从数组加载到模拟器的内存时,我实际上读取了数组的所有内容,称为“程序”并将其放入内存中。内存长2048,宽32位。寄存器也被声明为32位整数。因此当数组中的内容如Datum.datum(“string”)时 - Datum类具有IntDatum和StringDatum子类 - 我以某种方式将“字符串”存储在模拟器的内存数据段中。内存为0-1023文本和1024-2047数据区域。我还必须使用null char来划分字符串 - 加上任何检查完整内存等。我发现将一个String存储到MemContents(引用类型 - 空接口 - 由内存字段所属的类实现)的一种方法是将每个字符串(2个或4个符号)存储到寄存器中,然后获取寄存器的内容并将其存储在存储器中。所以,我发现很难实现这个和相反的程序。
答案 0 :(得分:1)
如果您在C中工作,您的字符串在一个大小为int的char数组中,您可以将指针指向char数组,将其转换为指向int数组的指针并执行任何你想要的int数组。如果你没有这个最后的保证,你可以简单地编写一个动态创建你的int数组的函数:
size_t IntArrayFromString(const char * Source, int ** Dest)
{
size_t stringLength=strlen(Source);
size_t intArrElements;
intArrElements=stringLength/sizeof(int);
if(stringLength%sizeof(int)!=0)
intArrElements++;
*Dest=(int *)malloc(intArrElements*sizeof(int));
(*Dest)[intArrElements-1]=0;
memcpy(Dest, Source, stringLength);
return intArrElements;
}
调用者负责释放Dest缓冲区。 (我不确定它是否真的有效,我没有测试过它)
答案 1 :(得分:1)
您是否考虑过使用String.getBytes()
?然后,您可以使用字节数组来创建int
(例如,使用BigInteger(byte[])
构造函数。
这可能不是最有效的解决方案,但可能不太容易出错并且更具可读性。
答案 2 :(得分:0)
假设Java:您可以查看ByteBuffer类,它是getInt方法。它有一个byte order parameter,您需要先配置它。
答案 3 :(得分:0)
基本上,我在JAVA练习。这是一个MIPS模拟器系统。我有注册,基准,指令,标签,控制,APSImulator类和其他。当我尝试将程序从数组加载到模拟器的内存时,我实际上读取了数组的所有内容,称为“程序”并将其放入内存中。内存长2048,宽32位。寄存器也被声明为32位整数。因此当数组中的内容如Datum.datum(“string”)时 - Datum类具有IntDatum和StringDatum子类 - 我以某种方式将“字符串”存储在模拟器的内存数据段中。内存为0-1023文本和1024-2047数据区域。我还必须使用null char来划分字符串 - 加上任何检查完整内存等。我发现将一个String存储到MemContents(引用类型 - 空接口 - 由内存字段所属的类实现)的一种方法是将每个字符串(2个或4个符号)存储到寄存器中,然后获取寄存器的内容并将其存储在存储器中。所以,我发现很难实现这个和相反的程序。
答案 4 :(得分:-1)
在C中执行此操作的一种常用方法是使用union
。它可能看起来像
union u_intstr {
char fourChars[4];
int singleInt;
};
将字符设置为联合
union u_intstr myIntStr;
myIntStr.fourChars[0] = ch1;
myIntStr.fourChars[1] = ch2;
myIntStr.fourChars[2] = ch3;
myIntStr.fourChars[3] = ch4;
然后以
的形式访问intprintf("%d\n", myIntStr.singleInt);
修改强>
在你的情况下,16英寸的联盟可以扩展为
union u_my16ints {
char str[16*sizeof(int)];
int ints[16];
};
答案 5 :(得分:-1)
这就是我想出来的
int len = strlen(str);
int count = (len + sizeof(int))/sizeof(int);
int *ptr = (int *)calloc(count, sizeof(int));
memcpy((void *)ptr, (void *)str, count*sizeof(int));
由于使用了calloc(),生成的缓冲区至少有一个NULL,可能更多填充最后一个整数。这是不可移植的,因为整数是本机字节顺序。