以编程方式填充uint8_t数组

时间:2019-11-18 17:10:13

标签: c string uint8t

我有一个uint8_t数组,看起来应该像这样。

Message: 
    AutoFixture.ObjectCreationExceptionWithPath : AutoFixture was unable to create an instance from RangedRequest (MemberType: System.Decimal, OperandType: System.Decimal Minimum: [String] 0.1, Maximum: [String] 1000) because creation unexpectedly failed with exception. Please refer to the inner exception to investigate the root cause of the failure.

    Request path:
        XUnitTestProject1.MyModel
          System.Decimal MyProp
            RangedRequest (MemberType: System.Decimal, OperandType: System.Decimal Minimum: [String] 0.1, Maximum: [String] 1000)

    Inner exception messages:
        System.ArgumentException: 0.1 is not a valid value for Decimal.
    Parameter name: value
          System.FormatException: Input string was not in a correct format.


    ---- System.ArgumentException : 0.1 is not a valid value for Decimal.
    Parameter name: value
    -------- System.FormatException : Input string was not in a correct format.
  Stack Trace: 
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 81
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at AutoPropertiesCommand`1.Execute(Object specimen, ISpecimenContext context) in AutoPropertiesCommand.cs line: 254
    at Postprocessor`1.Create(Object request, ISpecimenContext context) in Postprocessor.cs line: 290
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at Postprocessor`1.Create(Object request, ISpecimenContext context) in Postprocessor.cs line: 272
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at SpecimenFactory.Create[T](ISpecimenContext context) in SpecimenFactory.cs line: 25
    at UnitTest1.AutoFixture_ShouldCreateInstanceOfMyModel() in UnitTest1.cs line: 13
    at ----- Inner Stack Trace -----
    at BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    at RangedRequest.GetConvertedRangeBoundary(Object attributeValue, Type conversionType) in RangedRequest.cs line: 144
    at NumericRangedRequestRelay.Create(Object request, ISpecimenContext context) in NumericRangedRequestRelay.cs line: 32
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at ----- Inner Stack Trace -----
    at Number.StringToNumber(ReadOnlySpan`1 str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
    at Number.ParseDecimal(ReadOnlySpan`1 value, NumberStyles options, NumberFormatInfo numfmt)
    at Decimal.Parse(String s, NumberStyles style, IFormatProvider provider)
    at DecimalConverter.FromString(String value, NumberFormatInfo formatInfo)
    at BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)

现在,我无法在该数组中添加硬编码值,我需要从uint8_t code[1000] = {0x66, 0xba, 0xf8, 0x03} 中一个接一个地插入它们。 char buffer[300]的内容是用空格分隔的十六进制值char buffer[300]

的字符串

我写的代码是-

"66 ba f8 03"

如何将字符串值转换为 char* token = strtok(buffer, " "); // Keep printing tokens while one of the // delimiters present in str[]. int pc = 0; while (token != NULL) { code[pc] = token; // This part is wrong. I need to cast it properly token = strtok(NULL, " "); pc++; } 值?

1 个答案:

答案 0 :(得分:1)

使用strtol转换十六进制数字字符串的示例代码。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

int main(void)
{
    char buffer[300] = "66 ba f8 03";

    uint8_t code[1000];

    long val;
    char *endptr;

    char* token = strtok(buffer, " "); 
    // Keep printing tokens while one of the 
    // delimiters present in str[].
    int pc = 0; 
    while (token != NULL) {

        /* convert as a base16 number */
        val = strtol(token, &endptr, 16);

        /* The character following the number should be the end of the string as the input string is already tokenized. */
        if(*endptr) {
            /* error handling */
        } else if(val < 0) {
            /* error handling */
        } else if(val > UINT8_MAX) {
            /* error handling */
        } else {
            /* The checks above make sure that the value fits into uint8_t. */
            code[pc] = (uint8_t)val;
        }

        token = strtok(NULL, " "); 
        pc++;
    }

    for(int i = 0; i < pc; i++) {
        printf("code[%d] = 0x%02x\n", i, code[i]);
    }

    return 0;
}

错误处理取决于程序的其余部分。

注释:

strtok修改输入字符串,因此它不能是const char[]或字符串文字。

该循环不包含对code[pc]的超出范围访问的检查。

在上面的代码中进行编辑:无需检查*endptr中的空格,因为将空格用作令牌定界符,因此我们永远不应在{{ 1}}。

相关问题