2012-08-12 37 views
1

我正在尝试将文本字段中的某些文本转换为(n)u32值。例如,我输入字符串格式(表示32位整数),“0x30323436”,字符串格式输出为“0246”。我正在尝试在C#中执行此操作,但我也可以使用C语言。谢谢。将4个字节(从字符串格式)转换为一个u32。 C或C#

+1

我不没办法。如何从“30323436”获得“0246”?如果原始符号是十六进制,那么十进制值是808596534,而不是246. – 2012-08-12 22:08:18

+2

哦,我想我明白了......原始符号实际上是十六进制数字的ASCII代码。你应该在你的问题中提到这一点,我们不应该猜测这种事情 – 2012-08-12 22:10:29

+0

如果你真的只需要从字符串到字符串,并且你的输入是正确的,你可以提取其他每个字符。 – 2012-08-12 22:13:05

回答

1

这应该做你想要什么:

string ParseWeirdFormat(string input) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < input.Length; i += 2) 
    { 
     string hex = input.Substring(i, 2); 
     int value = Convert.ToInt32(hex, 16); 
     char c = (char)value; 
     sb.Append(c); 
    } 
    return sb.ToString(); 
} 
+0

非常感谢! – 2012-08-12 22:34:04

+0

实际上,如果文本是00,则会出现问题,然后结束字符串。有没有解决的办法? – 2012-08-20 07:08:27

+0

@DanGerendasy,只要检查'value == 0' ... – 2012-08-20 08:01:30

0

在C(C99以上):

#include <ctype.h> 
#include <stdbool.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

static bool cvt(const char* in, char* out) 
{ 
    if (strlen(in) != 8) 
     return false; 

    char* end; 
    long n = strtol(in, &end, 16); 
    if (end == in || *end) 
     return false; 

    for(int i = 0; i < 4; i++) 
    { 
     unsigned char c = n >> ((3-i)*8); 
     if(!isdigit(c)) 
      return false; 
     out[i] = c; 
    } 
    return true; 
} 

int main(int argc, char** argv) 
{ 
    char out[4]; 

    if (argc <= 1 || !cvt(argv[1], out)) 
    { 
     fprintf(stderr, "usage: %s hex-ASCII-encoding-of-four-digit-string\n", argv[0]); 
     return 1; 
    } 

    printf("%.4s\n", out); 

    return 0; 
} 
1

这就是为什么C是比C#冷却器:

char in[] = "0x30323436"; 
char out[5] = {0}; 
sscanf(in, "0x%02x%02x%02x%02x", &out[0], &out[1], &out[2], &out[3]); 
相关问题