如何将unsigned char *转换为QString

时间:2012-09-14 02:03:11

标签: c qt

我知道这是一个非常基本的问题,但有时你会失去基本概念:) 试过Goggling,但也没有足够的支持。

我正在使用我们设备所有者的预定义库。他们的声明如下:

unsigned char FamilySerialNum[0][8]

此变量以十六进制格式获取设备的序列号。现在我在Qt中使用这个库在QLineEdit中显示序列号。为此,我需要将其转换为QString。

尝试使用QString :: UTF8,strcpy(),sprintf()等但获取垃圾数据。

所以任何人都可以建议我一些方法来完成它。

4 个答案:

答案 0 :(得分:7)

您好请尝试以下功能......

QString getStringFromUnsignedChar(unsigned char *str)
{

    QString s;
    QString result = "";
    int rev = strlen(str); 

    // Print String in Reverse order....
    for ( int i = 0; i<rev; i++)
        {
           s = QString("%1").arg(str[i],0,16);

           if(s == "0"){
              s="00";
             }
         result.append(s);

         }
   return result;
}

答案 1 :(得分:7)

User1550798的答案非常接近,但不能正常工作(它产生的某些输出已损坏),因为它只将值“0”转换为零填充的2字符输出(即:“00”)。相反,任何单位数的十六进制值都应该用零填充(即:“3” - >“03”)。

请尝试以下方法:

QString getStringFromUnsignedChar( unsigned char *str ){
    QString result = "";
    int lengthOfString = strlen( reinterpret_cast<const char*>(str) );

    // print string in reverse order
    QString s;
    for( int i = 0; i < lengthOfString; i++ ){
        s = QString( "%1" ).arg( str[i], 0, 16 );

        // account for single-digit hex values (always must serialize as two digits)
        if( s.length() == 1 )
            result.append( "0" );

        result.append( s );
    }

    return result;
}

答案 2 :(得分:0)

int lengthOfString = strlen(reinterpret_cast(str)); // bug,当试图得到像“00889966”这样的长度时

QString getStringFromUnsignedChar( unsigned char *str, const int len ){
    QString result = "";
    int lengthOfString = len  );

    // print string in reverse order
    QString s;
    for( int i = 0; i < lengthOfString; i++ ){
        s = QString( "%1" ).arg( str[i], 0, 16 );

        // account for single-digit hex values (always must serialize as two digits)
        if( s.length() == 1 )
            result.append( "0" );

        result.append( s );
    }

    return result;
}

答案 3 :(得分:-1)

从unsigned char *到QString:

public static async Task Run(string myQueueItem, TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
    var manager = new Manager();
    RegisterMessage message = manager.ConvertMessage(myQueueItem);
    await manager.AddToHub(log, message.MacAddress);
    log.Info("fin du run");
}

public class Manager {

    string EndpointUrl = "endpoint";
    string PrimaryKey = "key";
    string connectionString = "connectionString";
    RegistryManager registryManager;
    DocumentClient client;

    public Manager() {
        registryManager = RegistryManager.CreateFromConnectionString(connectionString);
        client = new DocumentClient(new Uri(EndpointUrl), PrimaryKey);
    }

    public async Task AddToHub(TraceWriter log, string macAddress) {
        string deviceId = this.GenerateUniqueDevice(macAddress);
        var device = new Device(deviceId);
        try {
            await registryManager.AddDeviceAsync(device);
        }
        catch(Exception e) {
            log.Info($"{e.Message}");
        }
    }

    public RegisterMessage ConvertMessage(string queueItem) {
        return JsonConvert.DeserializeObject<RegisterMessage>(queueItem);
    }
    private string GenerateUniqueDevice(string macAddress)
    {
       ...
    }
}

从QString到unsigned char *:

unsigned char *str_uchar;
QString str = QString::fromUtf8((char*)str_uchar);
相关问题