将字符串存储在int中

时间:2009-11-22 23:30:49

标签: java types bit-manipulation

我尝试将字符串存储为整数,如下所示:

我读了字符串的字符,每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个符号)存储到寄存器中,然后获取寄存器的内容并将其存储在存储器中。所以,我发现很难实现这个和相反的程序。

6 个答案:

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

然后以

的形式访问int
printf("%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,可能更多填充最后一个整数。这是不可移植的,因为整数是本机字节顺序。