我有一个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++;
}
值?
答案 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}}。