2009-11-22 55 views
1

我尝试将字符串存储到一个整数如下字符串:保存在一个int

我读的字符串的字符,每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数据区域。我也必须用空字符分隔字符串 - 加上任何检查完整的内存等我找出一种方法来存储字符串MemContents(引用类型 - 空接口 - 由类实现的内存字段属于)是将字符串每个(2或4个符号)存储到一个寄存器,然后取出寄存器的内容并将其存储在内存中。所以,我发现很难实现这一点,反过程也是如此。

+0

你能保证输入的长度是4个字符的整数倍? – 2009-11-22 23:34:00

+1

您是使用C还是Java?您使用两种语言标记 – 2009-11-22 23:34:54

+4

为什么要在int数组中使用?不会有char数组是更直接吗? – 2009-11-22 23:35:30

回答

-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; 

,然后访问INT为

printf("%d\n", myIntStr.singleInt); 

编辑

根据你的情况为16整个工会可以扩展到看起来像

union u_my16ints { 
    char str[16*sizeof(int)]; 
    int ints[16]; 
}; 
+0

这取决于执行环境的字排序,而OP的原始代码没有。 – caf 2009-11-22 23:52:39

+0

@caf确实如此,但您可以确定这些字符像字符串一样排列。 – epatel 2009-11-22 23:54:54

+0

这是Java,而不是C. – 2009-11-23 09:21:04

1

如果你在C中工作,你的字符串是一个char数组的大小为int的大小的数组,你可以将指针指向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; 
} 

调用方负责释放目的地缓冲区。 (我不知道它是否真的有效,我没有测试)

-1

这是我想出

​​

由于使用释放calloc(中),得到的缓冲区有至少有一个NULL,可能会填充最后一个整数。这是不可移植的,因为整数是以本地字节顺序。

+0

他希望在Java中有一个解决方案,而不是C. – 2009-11-23 09:21:40

0

基本上,我在JAVA做一个练习。这是一个MIPS模拟器系统。我有注册,基准,指令,标签,控制,APSImulator类和其他。当我尝试从一个数组加载程序到模拟器的内存时,我实际上读取了被称为'程序'的数组的所有内容并将其放入内存中。内存是2048长,32位宽。寄存器也是32位整数。所以当数组中有像Datum.datum(“string”)这样的内容时 - Datum类有IntDatum和StringDatum子类 - 我有办法将“字符串”存储在模拟器的内存数据段中。内存是0-1023文本和1024-2047数据区域。我也必须用空字符分隔字符串 - 加上任何检查完整的内存等我找出一种方法来存储字符串MemContents(引用类型 - 空接口 - 由类实现的内存字段属于)是将字符串每个(2或4个符号)存储到一个寄存器,然后取出寄存器的内容并将其存储在内存中。所以,我发现很难实现这一点,反过程也是如此。

+0

Ponty:用这个来编辑问题。 – Spoike 2009-11-23 07:37:39

1

您是否考虑过简单地使用String.getBytes()?然后,您可以使用字节数组创建int S(例如,使用BigInteger(byte[])构造。

这可能不是最有效的解决方案,但可能不太容易出错,更具可读性。