隐式转换在 ZLib 压缩方法中丢失整数精度
Implicit conversion loses integer precision in ZLib compression method
Implicit conversion loses integer precision: 'unsigned long' to 'uInt'
(aka 'unsigned int')
我正在尝试将我的应用程序从 32 位更新到 64 位,因为更改架构后我收到了如上所述的错误。
我有一个方法采用 zlib 压缩的 NSData 和 returns 分解后的数据。
这就是方法。
- (NSData*) dataByDecompressingData:(NSData*)data {
NSLog(@"%lu", (unsigned long)data.length);
Byte* bytes = (Byte*)[data bytes];
NSInteger len = [data length];
NSMutableData *decompressedData = [[NSMutableData alloc] initWithCapacity:COMPRESSION_BLOCK];
Byte* decompressedBytes = (Byte*) malloc(COMPRESSION_BLOCK);
z_stream stream;
int err;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
stream.opaque = (voidpf)0;
stream.next_in = bytes;
err = inflateInit(&stream);
CHECK_ERR(err, @"inflateInit");
while (true) {
stream.avail_in = len - stream.total_in; // this is where the error happens the yellow triangle is under the "minus" -
stream.next_out = decompressedBytes;
stream.avail_out = COMPRESSION_BLOCK;
err = inflate(&stream, Z_NO_FLUSH);
[decompressedData appendBytes:decompressedBytes length:(stream.total_out-[decompressedData length])];
if(err == Z_STREAM_END)
break;
CHECK_ERR(err, @"inflate");
}
err = inflateEnd(&stream);
CHECK_ERR(err, @"inflateEnd");
free(decompressedBytes);
return decompressedData;
}
我不知道如何解决这个问题。我尝试使用 (int) 键入 cast len 但这仍然不起作用。
.
这不是错误,而是警告。如果你想让它静音,你可以简单地将表达式的 unsigned long
部分转换为 unsigned int
:
stream.avail_in = (uint)(len - stream.total_in);
该警告只是提醒您将 long 转换为 int,从而失去精度;并且由于您没有明确地将 long 转换为 int,您的编译器只是让您知道您可能无意中失去了精度。
正如 Lyndsey 指出的那样,您可以轻松地消除警告。但是,为了完整和足够偏执,您应该验证 len
小于或等于最大 unsigned
值(您可以简单地将它分配给一个无符号的并查看它是否仍然相等到 len
)、 或 您可以添加一个外循环来一次处理 UINT_MAX 块输入数据。
Implicit conversion loses integer precision: 'unsigned long' to 'uInt' (aka 'unsigned int')
我正在尝试将我的应用程序从 32 位更新到 64 位,因为更改架构后我收到了如上所述的错误。
我有一个方法采用 zlib 压缩的 NSData 和 returns 分解后的数据。
这就是方法。
- (NSData*) dataByDecompressingData:(NSData*)data {
NSLog(@"%lu", (unsigned long)data.length);
Byte* bytes = (Byte*)[data bytes];
NSInteger len = [data length];
NSMutableData *decompressedData = [[NSMutableData alloc] initWithCapacity:COMPRESSION_BLOCK];
Byte* decompressedBytes = (Byte*) malloc(COMPRESSION_BLOCK);
z_stream stream;
int err;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
stream.opaque = (voidpf)0;
stream.next_in = bytes;
err = inflateInit(&stream);
CHECK_ERR(err, @"inflateInit");
while (true) {
stream.avail_in = len - stream.total_in; // this is where the error happens the yellow triangle is under the "minus" -
stream.next_out = decompressedBytes;
stream.avail_out = COMPRESSION_BLOCK;
err = inflate(&stream, Z_NO_FLUSH);
[decompressedData appendBytes:decompressedBytes length:(stream.total_out-[decompressedData length])];
if(err == Z_STREAM_END)
break;
CHECK_ERR(err, @"inflate");
}
err = inflateEnd(&stream);
CHECK_ERR(err, @"inflateEnd");
free(decompressedBytes);
return decompressedData;
}
我不知道如何解决这个问题。我尝试使用 (int) 键入 cast len 但这仍然不起作用。 .
这不是错误,而是警告。如果你想让它静音,你可以简单地将表达式的 unsigned long
部分转换为 unsigned int
:
stream.avail_in = (uint)(len - stream.total_in);
该警告只是提醒您将 long 转换为 int,从而失去精度;并且由于您没有明确地将 long 转换为 int,您的编译器只是让您知道您可能无意中失去了精度。
正如 Lyndsey 指出的那样,您可以轻松地消除警告。但是,为了完整和足够偏执,您应该验证 len
小于或等于最大 unsigned
值(您可以简单地将它分配给一个无符号的并查看它是否仍然相等到 len
)、 或 您可以添加一个外循环来一次处理 UINT_MAX 块输入数据。