C# 将4字符字符串转换为int32

C# 将4字符字符串转换为int32,c#,C#,有没有一种将4个字符转换成32位整数的快速方法?我知道我可以像这样循环: string key = "ABCD"; int val = 0; for (int i = 0; i < 4; i++) { int b = (int)key[i] * (int)Math.Pow(256, i); val += b; } // val = 1145258561 string key=“ABCD”; int-val=0; 对于(int i=0;i=0;i--) { val请注意,C

有没有一种将4个字符转换成32位整数的快速方法?我知道我可以像这样循环:

string key = "ABCD";
int val = 0;
for (int i = 0; i < 4; i++)
{
    int b = (int)key[i] * (int)Math.Pow(256, i);
    val += b;
}
// val = 1145258561
string key=“ABCD”;
int-val=0;
对于(int i=0;i<4;i++)
{
intb=(int)key[i]*(int)Math.Pow(256,i);
val+=b;
}
//val=1145258561

我想要一些低层次的东西,我知道字符是以字节的形式存储的。我不介意它的代码是否不安全,因为我基本上是在尝试将4个字符的字符串写入整数指针位置。

使用字节,位转换器:

byte[] bytes = ...;
int i = BitConverter.ToInt32(bytes, 0)

可以首先使用适当的编码将字符串转换为字节数组(请参见),然后使用将字节数组转换为整数

string s = "ABCD";
byte[] bytes = encoding.GetBytes(s);  /* Use the correct encoding here. */
int result = BitConverter.ToInt32(bytes, 0);
结果:

1145258561
ABCD
要从整数中获取字符串,只需颠倒过程:

int i = 1145258561;
byte[] bytes = BitConverter.GetBytes(i);
string s = encoding.GetString(bytes);
结果:

1145258561
ABCD
请注意,BitConverter类给出的结果取决于它所运行的机器的端度。如果希望代码独立于平台,可以查看的是的库中的EndianBitConverter


演出 我测试了三种实现的性能:

Math.Pow

int convert1(string key)
{
    int val = 0;
    for (int i = 0; i < 4; i++)
    {
        int b = (int)key[i] * (int)Math.Pow(256, i);
        val += b;
    }
    return val;
}
位移位

int convert3(string key)
{
    int val = 0;
    for (int i = 3; i >= 0; i--)
    {
        val <<= 8;
        val += (int)key[i];
    }
    return val;
}
int-convert3(字符串键)
{
int-val=0;
对于(int i=3;i>=0;i--)
{
val请注意,C#中的字符串包含Unicode字符,而不是字节。我不知道您想用这个问题解决什么样的问题,但请注意,您只能将4个字节转换为32位整数。转换Unicode字符串只有在假设字节编码时才有意义。因此,如果您想将文本视为Windows-1252(非常常见的Windows字符集),首先对字符串进行编码,然后将字节转换为整数值

byte[] bytes = Encoding.GetEncoding(1252).GetBytes("ABCÖ");
uint res = BitConverter.ToUInt32(bytes, 0);
结果是
res==0xD6434241
(在一台小型endian机器上)。0xD6是“Ö”的Windows-1252数字


根据您的问题,您可能更希望直接使用字节(Stefan Steinegger已经建议了)。

越简单越好:

/*
** Made by CHEVALLIER Bastien
** Prep'ETNA Promo 2019
*/

#include <stdio.h>

int main()
{
  int i;
  int x;
  char e = 'E';
  char t = 'T';
  char n = 'N';
  char a = 'A';

  ((char *)&x)[0] = e;
  ((char *)&x)[1] = t;
  ((char *)&x)[2] = n;
  ((char *)&x)[3] = a;

  for (i = 0; i < 4; i++)
    printf("%c\n", ((char *)&x)[i]);
  return 0;
}
/*
**由骑士巴斯蒂安制作
**2019年Prep'ETNA促销活动
*/
#包括
int main()
{
int i;
int x;
字符e='e';
chart='t';
字符n='n';
字符a='a';
((char*)&x)[0]=e;
((char*)&x)[1]=t;
((char*)&x)[2]=n;
((char*)&x)[3]=a;
对于(i=0;i<4;i++)
printf(“%c\n”,((char*)&x)[i]);
返回0;
}

别忘了,C#中的字符是Unicode字符,采用16位而不是8位。这非常好,谢谢!我会看看它是否足够快。有没有办法将其翻转过来?重要的是,这只能对ASCII字符正确工作。
asciencoding
(或者通常是
编码类)它的实现非常愚蠢:如果无法编码,它只是用“?”替换字符。谢谢!位移位就是我要找的。我从来没有在c#中做过任何位移位,但我知道它必须在某个地方。我正在内存块中创建一个aTree链接列表。4个字符实际上是字典的键,所以我是jus不要散列它们。我不需要担心unicode(哇)。
/*
** Made by CHEVALLIER Bastien
** Prep'ETNA Promo 2019
*/

#include <stdio.h>

int main()
{
  int i;
  int x;
  char e = 'E';
  char t = 'T';
  char n = 'N';
  char a = 'A';

  ((char *)&x)[0] = e;
  ((char *)&x)[1] = t;
  ((char *)&x)[2] = n;
  ((char *)&x)[3] = a;

  for (i = 0; i < 4; i++)
    printf("%c\n", ((char *)&x)[i]);
  return 0;
}